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