exists和in的区别

参考博客:(138条消息) MySQL中In与Exists的区别_lzcWHUT的博客-CSDN博客

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

索引

1)IN查询在内部表和外部表上都可以使用到索引。
2)Exists查询仅在内部表上可以使用到索引。

 

in 的工作原理
查询过程类似于双重遍历
A表有10000条 B表有100条记录,最多有可能遍历10000 * 100 ‘

exists的工作原理
遍历A表,每次遍历判断exists()查询数据库
A表有10000条记录,B表有100000000条记录,那么exists()还是执行10000次,因为它只执行A.length次,可见B表数据越多,越适合exists()发挥效果。
A表有10000条记录,B表有100条记录,那么exists()还是执行10000次,
还不如使用in()遍历10000*100次,因为in()是在内存里遍历比较,而exists()需要查询数据库,我们都知道查询数据库所消耗的性能更高,而内存比较很快。

 

总结:

当子查询结果集很大,而外部表较小的时候,Exists的Block Nested Loop(Block 嵌套循环)的作用开始显现,并弥补外部表无法用到索引的缺陷,查询效率会优于IN。

 当子查询结果集较小,而外部表很大的时候,Exists的Block嵌套循环优化效果不明显,IN 的外表索引优势占主要作用,此时IN的查询效率会优于Exists。
 

posted @ 2023-02-08 17:26  下饭  阅读(78)  评论(0编辑  收藏  举报