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要快。

posted @ 2020-10-15 11:03  衰草寒烟  阅读(278)  评论(0)    收藏  举报