MySQL中exists和in的区别及使用场景
程序员文章站
2022-04-20 21:12:19
...
exists和in的使用方式:
#对B查询涉及id,使用索引,故B表效率高,可用大表 -->外小内大
select * from A where exists (select * from B where A.id=B.id);
#对A查询涉及id,使用索引,故A表效率高,可用大表 -->外大内小
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),子查询物化将子查询结果存入临时表,确保子查询只执行一次,该表不记录重复数据且采用哈希索引查找;
而之前的版本则会把非相关子查询转化为相关子查询,导致效率低下(尤其是子查询是小表,外表是大表的情况下,效率变慢许多)。
上一篇: MySQL中的变量
下一篇: (十)MySQL中的变量
推荐阅读
-
关于MySql 和SqlServer 中left join , full join的一点区别
-
Python中的单下划线和双下划线使用场景详解
-
jquery中eq和get的区别与使用方法_jquery
-
mysql中int、bigint、smallint 和 tinyint的区别详细介绍
-
Java中HashMap和Hashtable及HashSet的区别
-
MySQL中interactive_timeout和wait_timeout的区别
-
MySQL中REPLACE INTO和INSERT INTO的区别分析
-
MYSQL 左连接右连接和内连接的详解及区别
-
.NET中的async和await关键字使用及Task异步调用实例
-
浅谈Java中BIO、NIO和AIO的区别和应用场景