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 命令检查查询计划可以看出差异:
请注意,使用 = 运算符的查询计划中没有 "DEPENDENT SUBQUERY"。
以上是为什么即使只有一个值,MySQL 的 IN 运算符也比 = 慢?的详细内容。更多信息请关注PHP中文网其他相关文章!