首页 > 数据库 > mysql教程 > 为什么即使只有一个值,MySQL 的 IN 运算符也比 = 慢?

为什么即使只有一个值,MySQL 的 IN 运算符也比 = 慢?

Linda Hamilton
发布: 2025-01-16 17:38:11
原创
967 人浏览过

Why is MySQL's `IN` operator slower than `=` even with a single value?

MySQL 查询性能异常:IN 运算符与等号运算符的性能差异

问题描述

在 MySQL 中,使用 IN 条件的 SELECT 查询语句性能明显低于使用等号 (=) 运算符的相同查询语句。即使 IN 条件只包含单个值,性能差异也可能很大。

解释

这个问题源于 MySQL 中的一个优化缺陷,该缺陷在 MySQL 5.6.x 版本中已得到修复。当包含 IN 条件的子查询被错误地分类为依赖子查询而不是独立子查询时,就会出现此问题。

依赖子查询与独立子查询

  • 依赖子查询: 对于外层查询中的每一行,都会执行一次依赖子查询,导致多次计算。
  • 独立子查询: 只执行一次,与外层查询的行数无关。

示例查询分析

以下示例查询演示了这种异常情况:

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

执行此查询时,子查询被视为依赖子查询,导致性能低下。但是,将 IN 替换为 = 可以消除依赖性,并显著提高性能。

查询计划比较

使用 EXPLAIN 命令检查查询计划可以看出差异:

  • IN 条件:
    • 'PRIMARY' 'question_law_version' 'ALL' '' '' '' '' 10148 'Using where'
    • 'DEPENDENT SUBQUERY' 'question_law_version' 'ALL' '' '' '' '' 10148 'Using where'
    • 'DEPENDENT SUBQUERY' 'question_law' 'ALL' '' '' '' '' 10040 'Using where'
  • 等号条件:
    • 'PRIMARY' 'question_law_version' 'ALL' '' '' '' '' 10148 'Using where'
    • 'SUBQUERY' 'question_law_version' 'ALL' '' '' '' '' 10148 'Using where'
    • 'SUBQUERY' 'question_law' 'ALL' '' '' '' '' 10040 'Using where'

请注意,使用 = 运算符的查询计划中没有 "DEPENDENT SUBQUERY"。

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

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