MySQL中in(独立子查询)的执行计划

在之前有一篇文章讲了in(常量列表)的执行计划,详见链接:http://blog.itpub.net/28912557/viewspace-1255568/
那么对于对于in(独立子查询),MYSQL会怎么执行呢?其实,现代mysql优化器都会将in独立子查询语句转换为exists相关子查询。

所以有些人发现在MYSQl中测试发现in与exists性能差不多,就是这个原因。因此我们就不必纠结是选择in还是exists了,大部分情况下,其实都一样。

但是这里有一个问题,假如外部查询、子查询分别有M、N条记录,那么整个查询会进行O(M+M*N)次扫描,意味着逻辑IO大大增加。(M为外部表查询扫描次数,M*N为exists相关子查询扫描次数)。

为了减少逻辑IO,可以对相关子查询进行优化,譬如:

1,对子查询建立索引,这是显而易见的。

2,假如子查询中有group by操作,每一次关联外部查询都会进行group by,可以考虑在子查询外面再嵌套一层子查询,做成静态的,减少逻辑IO。

3,使用派生表重写子查询,进行表连接。

总之,按需求来优化。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/28912557/viewspace-1445484/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/28912557/viewspace-1445484/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值