美文网首页
MySQL中in(独立子查询)的执行计划

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

作者: 田真的架构人生 | 来源:发表于2017-08-03 21:39 被阅读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,使用派生表重写子查询,进行表连接。
    总之,按需求来优化。

    相关文章

      网友评论

          本文标题:MySQL中in(独立子查询)的执行计划

          本文链接:https://www.haomeiwen.com/subject/ezrmlxtx.html