作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
以下是否存在性能差异?
SELECT person.id
FROM person
LEFT JOIN address ON person.id = address.personID
WHERE address.personID IS NOT NULL
对比
SELECT person.id
FROM person
INNER JOIN address ON person.id = address.personID
此查询应显示所有具有地址记录的人员 ID(并非全部)。此处合乎逻辑的做法是使用内部联接,如第二个示例所示。由于并非完全重要的原因(查询是从查询构建器生成的),我可能不得不使用第一种方法。
很好奇影响是什么。 MySQL 在 LEFT JOIN 时是否做了很多额外的工作,然后将该字段与 null 进行比较以减少集合?也许这就是 INNER JOIN 在幕后的工作方式?
最佳答案
如下所示,这两个查询可能有不同的执行计划:
SELECT p.*, s.*
FROM p
LEFT
JOIN s ON s.col = p.col
WHERE s.col IS NOT NULL
SELECT p.*, s.*
FROM p
INNER
JOIN s ON s.col = p.col
id select_type table type poss key key_len ref rows Extra
-- ----------- ------ ---- ---- ---- ------- ----- ---- --------
1 SIMPLE p ALL - - - - 3
1 SIMPLE s ref s_ix s_ix 9 p.col 1
id select_type table type poss key key_len ref rows Extra
-- ----------- ------ ---- ---- ---- ------- ----- ---- -----------------------------
1 SIMPLE s ALL s_ix - - - 2
1 SIMPLE p ALL p_ix - - - 3 Using where; Using join buffer
因此,我们必须得出结论,性能可能存在差异。在小集合上,差异可以忽略不计。大集合可能会显示出显着的性能差异;我们希望 INNER JOIN 更有效率。完全有可能有一个测试用例可以证明 LEFT JOIN 的性能更好,但我还没有找到。
关于MySQL 内部连接 VS 左连接 w/IS NOT NULL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22568787/
我是一名优秀的程序员,十分优秀!