MySQL优化:子查询(in)与连接(join)

一、引入


SQL1:

select count(1)
from 
table1 a inner join table2 b on a.tid=b.tid
         inner join table3 c on a.tid=c.tid
where
	a.tid2 in 
	(select d.tid2 from table4 d);  

SQL2:

select count(1)
from 
table1 a inner join table2 b on a.tid=b.tid
         inner join table3 c on a.tid=c.tid
         inner join table4 d on a.tid2=d.tid2;     

对于这两条语句我们可以思考

  1. 两条语句的执行结果一致吗?
  2. in和join的效率哪个高一些?

二、结果分析

对于in来说,结果不会产生重复数据;而对于join来说,如果驱动表或被驱动表所关联的列有重复值,结果会有重复值。
因为join做的是全连接,会把值都保存下来,而in只会保留重复值的第一个数据。


三、性能分析

假设驱动表A,某列长n,被驱动表B,某列长m。

3.1 in

对于in子查询来说,比较次数为n*m次

3.2 join

对于join,其实MySQL有三种方式:

优先级Index Nested-LoopJoin > Block Nested-Loop Join > Simple Nested-Loop Join

  1. Simple Nested-Loop Join:简单嵌套循环连接,n*m次。
  2. Index Nested-Loop Join:索引嵌套循环连接,n*B表索引的高度。
  3. Block Nested-Loop Join:缓存块嵌套循环连接,会大大减少内层循环的次数。(默认使用这种算法,默认状态时on)

3.3 小结

所以对于两种方式相比较,肯定是选择join来对SQL做优化呀

这也是一个SQL优化的经典问题,好啦,今天就到这里啦,有问题随机私聊小编~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

森格的博

创作不易,感谢支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值