MySQL中exists和in的区别及使用场景

Posted 小熊_看看

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL中exists和in的区别及使用场景相关的知识,希望对你有一定的参考价值。

  exists和in的使用方式:  

select * from A where exists (select * from B where A.id=B.id);
select * from A where A.id in (select id from B);

  1、exists是对外表做loop循环,每次loop循环再对内表(子查询)进行查询,那么是对内表的查询使用的索引,而外表有多大都需要遍历,不可避免,故内表大的使用exists,可加快效率;

  2、in是把外表和内表做hash连接,先查询内表,再把内表结果与外表匹配,对外表使用索引,而内表多大都需要查询,不可避免,故外表大的使用in,可加快效率。

  3、如果用not in ,则是内外表都全表扫描,无所因,效率低,可考虑使用not exists,也可使用A left join B on A.id=B.id where B.id is null 进行优化。

  此外,新近遇到的坑,mysql版本问题:

  MySQL版本问题:5.6.5优化了子查询,引入物化子查询(针对where clause的subquery),子查询物化将子查询结果存入临时表,确保子查询只执行一次,该表不记录重复数据且采用哈希索引查找;

而之前的版本则会把非相关子查询转化为相关子查询,导致效率低下(尤其是子查询是小表,外表是大表的情况下,效率变慢许多)。  

  相关子查询:子查询依赖外层连接的返回值;

  非相关子查询:子查询不依赖外层连接的返回值;

  本来是内表小,用的in,但是据说5.6之前的版本会把非相关子查询改为相关子查询,就是把in的语句改成了exists的,结果效率超低。

以上是关于MySQL中exists和in的区别及使用场景的主要内容,如果未能解决你的问题,请参考以下文章

[SQL] in和exists的区别

[SQL] in和exists的区别

MySQL中in和exists的区别

MySQL EXISTS和in的区别

oracle中in和exist的区别

MySQL-IN和Exists区别