MySQL で IN
演算子が =
演算子よりも遅い理由
場合によっては、MySQL の IN
条件の実行が =
条件よりも遅くなることがあります。これは既知の問題です。根本的な原因は、MySQL オプティマイザーが IN
条件でサブクエリを処理するときに、サブクエリを独立サブクエリではなく依存サブクエリとして誤って識別する場合があることです。
したがって、IN
条件のサブクエリは親クエリの行ごとに 1 回実行されますが、=
条件のサブクエリは 1 回だけ実行されます。これは、特に大規模なデータ セットを操作する場合に、パフォーマンスに大きな違いが生じる可能性があります。
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」行は、サブクエリが 1 回だけ実行されるようになり、実行が高速化されることを示します。
この問題は MySQL 5.6.x バージョンで解決されました。可能であれば、新しい MySQL バージョンにアップグレードすると、この問題が解決され、パフォーマンスが向上する可能性があります。
以上がMySQL サブクエリで「IN」が「=」よりも遅いのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。