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中文网其他相关文章!