首页 > 数据库 > mysql教程 > 为什么在 MySQL 查询中,即使只有一个值,`IN` 也比 `=` 慢?

为什么在 MySQL 查询中,即使只有一个值,`IN` 也比 `=` 慢?

Mary-Kate Olsen
发布: 2025-01-16 17:06:13
原创
380 人浏览过

Why is `IN` slower than `=` in MySQL queries, even with a single value?

MySQL 的 IN= 性能差异

问题:使用 IN 运算符的 MySQL 查询可能比使用 = 运算符的查询慢得多,即使 IN 与单个值进行比较也是如此。

根本原因: 问题在于 MySQL 如何处理 IN 子句中的子查询。旧版本(5.6 之前)经常将这些子查询错误地识别为依赖子查询。

依赖子查询与独立子查询: 对外部查询中的 行重新执行依赖子查询,导致显着的性能开销。 独立子查询只执行一次。 MySQL 的早期版本错误地将 IN 子查询视为依赖子查询,即使它们返回单个值也是如此。

解释分析: EXPLAIN 命令揭示了此行为。 带有子查询的 IN 查询在执行计划中显示“DEPENDENT SUBQUERY”,而使用 = 的等效查询则显示“SUBQUERY”。

示例 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>
登录后复制

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>
登录后复制

示例:

这个简单的查询演示了问题:

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

即使子查询返回单个值,它也会被视为依赖,从而导致执行速度缓慢。 将 IN 替换为 = 可以显着提高性能。

解决方案:

MySQL 5.6及更高版本中解决了性能问题。 升级到新版本可以解决此差异。 如果升级不可行,可以使用子查询(例如使用联接)重写查询来避免 IN

以上是为什么在 MySQL 查询中,即使只有一个值,`IN` 也比 `=` 慢?的详细内容。更多信息请关注PHP中文网其他相关文章!

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