IN
と =
のパフォーマンスの差異問題: IN
演算子を使用した MySQL クエリは、=
が単一の値と比較した場合でも、IN
演算子を使用したクエリよりも驚くほど遅くなる可能性があります。
根本原因: 問題は、MySQL が IN
句内のサブクエリを処理する方法にあります。古いバージョン (5.6 より前) では、これらのサブクエリを 依存 サブクエリとして誤認することがよくあります。
依存サブクエリと独立サブクエリ: 依存サブクエリは外側のクエリの 各 行に対して再実行されるため、パフォーマンスに重大なオーバーヘッドが発生します。 独立したサブクエリは 1 回だけ実行されます。 MySQL の以前のバージョンでは、IN
サブクエリが単一の値を返した場合でも、依存しているものとして誤って処理されました。
EXPLAIN 分析: 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>
サブクエリによって返された値が 1 つであっても、それは依存しているものとして扱われるため、実行が遅くなります。 IN
を =
に置き換えると、パフォーマンスが大幅に向上します。
解決策:
パフォーマンスの問題は、MySQL 5.6 以降のバージョンで解決されました。 新しいバージョンにアップグレードすると、この不一致が解決されます。 アップグレードが不可能な場合は、サブクエリ (結合などを使用) で IN
を回避するようにクエリを書き直すことが回避策になる可能性があります。
以上がMySQL クエリでは、値が 1 つであっても、「IN」 の方が「=」 よりも遅いのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。