原文地址

1 select * from A where id in(select id from B)
2 
3 select a.* from A a where exists(select 1 from B b where a.id=b.id)

先说结论:in 适合B表比A表数据小的情况  ,  exists 适合B表比A表数据大的情况   ;  A表和B表 数据量大致一样时,效率相差无几

in

先对子查询进行查询,然后与主查询结果做笛卡尔积,然后按照条件筛选,所以子查询数据量比较少的时候,会大大减少笛卡尔积的大小。

exists

子查询只是个检测行是否存在的条件,返回 true 则加入结果集,false 就不加入结果集。

先查询主查询的结果,然后按照结果循环去判断每条数据是否满足子查询条件,满足则存留结果,否则从结果集中去除

not in 和 not exists

如果查询使用了not in 那么内外表都进行全表扫描,没有用到索引;

而not extsts 的子查询依然能用到表上的索引。所以无论那个表大,用not exists都比not in要快。

版权声明:本文为xiaopan-cp9原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/xiaopan-cp9/p/13819347.html