首页 > 数据库 > mysql教程 > 为什么MySQL子查询中`IN`比`=`慢?

为什么MySQL子查询中`IN`比`=`慢?

Patricia Arquette
发布: 2025-01-16 17:18:12
原创
383 人浏览过

Why is `IN` slower than `=` in MySQL subqueries?

MySQL 中 IN 操作符比 = 操作符慢的原因

在某些情况下,MySQL 中 IN 条件的执行速度比 = 条件慢,这是一个已知问题。其根本原因在于,MySQL 优化器在处理 IN 条件中的子查询时,有时会错误地将其识别为依赖子查询,而不是独立子查询。

因此,IN 条件中的子查询会为父查询中的每一行都执行一次,而 = 条件中的子查询只执行一次。这会导致显着的性能差异,尤其是在处理大型数据集时。

让我们来看一个 SELECT 查询示例:

<code class="language-sql">SELECT *
FROM question_law_version
WHERE law_version IN (SELECT MAX(foo_id) FROM bar);</code>
登录后复制

使用 EXPLAIN 分析此查询,结果可能如下:

<code>1  'PRIMARY'             'question_law_version'  'ALL'  ''  ''  ''  ''  10148  'Using where'
2  'DEPENDENT SUBQUERY'  'question_law_version'  'ALL'  ''  ''  ''  ''  10148  'Using where'
3  'DEPENDENT SUBQUERY'  'question_law'          'ALL'  ''  ''  ''  ''  10040  'Using where'</code>
登录后复制

"DEPENDENT SUBQUERY" 行表明,IN 条件中的子查询正在为父查询的每一行执行。

如果我们将 IN 条件改为 =

<code class="language-sql">SELECT *
FROM question_law_version
WHERE law_version = (SELECT MAX(foo_id) FROM bar);</code>
登录后复制

EXPLAIN 的输出将变为:

<code>1  'PRIMARY'   'question_law_version'  'ALL'  ''  ''  ''  ''  10148  'Using where'
2  'SUBQUERY'  'question_law_version'  'ALL'  ''  ''  ''  ''  10148  'Using where'
3  'SUBQUERY'  'question_law'          'ALL'  ''  ''  ''  ''  10040  'Using where'</code>
登录后复制

"SUBQUERY" 行表明,子查询现在只执行一次,从而提高了执行速度。

这个问题在 MySQL 5.6.x 版本中已得到解决。如果可能,升级到较新的 MySQL 版本可以解决此问题并获得性能提升。

以上是为什么MySQL子查询中`IN`比`=`慢?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板