exists与in
1、exists和in
- in 是把外表和内表做hash join
- exists是对外表做loop,每次loop再对内表进行查询
select * from t1 a where exists (select * from t2 b where b.id = a.id)
分析:用到了 t2的id索引,全程扫描的t1表
可以理解为
for a.id in ( select * from t1 a)
loop
if ( exists ( select b.id from t2 b where b.id = a.id )
then
OUTPUT THE RECORD!
end if
end loop
可以看出t1表的数据多大,就循环多少次,如果t1表很大,效率就会低,所以适用于外表小而内表大的情况
select * from t1 a where a.id in (select b.id from t2 b)
分析:用到t1表上的id的索引,全程扫描t2表,
可以理解为
select * from t1 a,
( select distinct id from t2 ) b1
where a.id = b1.id
如果t2表很大,效率就会降低,所以适用于外表大而内表小的情况
总结:
-
IN适合于外表大而内表小;
-
EXISTS适合于外表小而内表大
2、not exists和not in
-
使用了Not In,那么内外表全部进行扫描,没有用到索引
-
Not Exist用到子表中的索引进行查询,所以无论两个表中哪个表大,Not exists 都要比Not in 要快。