sql调优之in和exists

本文深入探讨了SQL中IN与Exists子查询的执行过程及性能差异。通过具体示例,解析了两者在不同场景下的优劣,指出当子查询结果集大小与外部表大小对比变化时,IN和Exists的效率表现也会随之改变。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

俩者执行过程:

IN 执行过程:
sql示例:select * from tabA where x in (select x from tabB);
其执行计划:
(1)执行tabB表的子查询,得到结果集B;
(2)执行tabA表的查询,查询条件是x在结果集B里面,可以使用到tabA表的索引x。

Exists执行过程
sql示例:select * from tabA where exists (select x from tabB where tabA.x = x);
其执行计划:
(1)先将tabA表所有记录取到。
(2)逐行针对tabA表的记录,去关联tabB表,判断tabB表的子查询是否有返回数据,5.5之后的版本使用Block Nested Loop(Block 嵌套循环)。
(3)如果子查询有返回数据,则将tabA当前记录返回到结果集。
tabA相当于取全表数据遍历,tabB可以使用到索引。

个人总结:

当子查询结果集很大,而外部表较小的时候,Exists的Block Nested Loop(Block嵌套循环)的作用开始显现,并弥补外部表无法用到索引的缺陷,查询效率会优于IN。in 相当于把子查询查到的结果放到内存里和外查询比较,当子查询查到的数据过大时效率就低了,而exists相当于子查询是一次又一次的查询数据库。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值