ITPub博客

首页 > 数据库 > MySQL > MySQL中in(独立子查询)的执行计划

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

原创 MySQL 作者:541732025 时间:2015-03-02 14:45:57 0 删除 编辑

在之前有一篇文章讲了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博客 ” ,链接:https://blog.itpub.net/28912557/viewspace-1445484/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2013-05-23

  • 博文量
    127
  • 访问量
    515719