MySQL中的in和exists区别
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要快。