exists的效率依赖于匹配度。
inner join效率比较稳定。
select * from ta a where exists(select 1 from tb where a.id=b.id)
每扫ta一行,都扫tb,遇到匹配即返回ture,对tb的扫描在ta当前行不再继续下去,如果一直没找到,就会扫完tb (索引,或表扫)
即是说,匹配度很低,效率就很差。
举个极端, tb中每行的id都与ta中每行id相同
即 ta
id
1
1
1
1
1
,,,
tb
id
1
1
1
1
1
1
一扫就有返回,效率极高
反之
ta
id
1
1
1
1
1
1
1
...
tb
id
0
0
0
0
0
0
..
每扫ta一行,都要扫完tb,效率极差。
内连接效率则稳定。 在不很清楚实际数据分布情况下,最好用内连接。
本文探讨了SQL查询中的exists和inner join的使用效率问题。通过对比两者在不同数据匹配度下的表现,得出在数据分布未知的情况下推荐使用inner join的结论。
726

被折叠的 条评论
为什么被折叠?



