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

2017-08-03  本文已影响0人  田真的架构人生

在之前有一篇文章讲了in(常量列表)的执行计划,详见链接:
http://blog.itpub.net/28912557/viewspace-1255568/
那么对于对于in(独立子查询),MYSQL会怎么执行呢?其实,现代mysql优化器都会将in独立子查询语句转换为exists相关子查询。
所以有些人发现在MYSQl中测试发现in与exists性能差不多,就是这个原因。因此我们就不必纠结是选择in还是exists了,大部分情况下,其实都一样。
但是这里有一个问题,假如外部查询、子查询分别有M、N条记录,那么整个查询会进行O(M+MN)次扫描,意味着逻辑IO大大增加。(M为外部表查询扫描次数,MN为exists相关子查询扫描次数)。
为了减少逻辑IO,可以对相关子查询进行优化,譬如:
1,对子查询建立索引,这是显而易见的。
2,假如子查询中有group by操作,每一次关联外部查询都会进行group by,可以考虑在子查询外面再嵌套一层子查询,做成静态的,减少逻辑IO。
3,使用派生表重写子查询,进行表连接。
总之,按需求来优化。

上一篇下一篇

猜你喜欢

热点阅读