SQL の IN
条件: =
特定の状況では、SQL の IN
条件は =
演算子と比較してパフォーマンスが大幅に低下する可能性があります。これは古い MySQL バージョンでは顕著な問題でしたが、新しいバージョン (MySQL 5.6 以降) ではこの問題に対処しました。
パフォーマンスの違いは、最適化の課題に起因します。 IN
句内のサブクエリが、独立 ではなく、依存 として誤って識別される可能性があります。これにより、メイン クエリの行ごとにサブクエリが繰り返し実行されることになり、パフォーマンスに劇的な影響を与えます。
例を見てみましょう:
<code class="language-sql">SELECT * FROM question_law_version WHERE question_law_id 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」の指定に注目してください。 内部クエリは繰り返し実行されます。 ただし、=
を使用してクエリを書き直すと (サブクエリが単一の値を返すと仮定します):
<code class="language-sql">SELECT * FROM question_law_version WHERE question_law_id = ( SELECT MAX(foo_id) FROM bar );</code>
...多くの場合、より効率的な計画が得られます:
<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 (古いバージョンでの) IN
句のサブクエリ依存関係の誤った解釈から発生します。 データベースによるこれの処理が非効率的であるため、パフォーマンスの低下につながります。
以上がSQL の「IN」条件が「=」演算子よりも遅い場合があるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。