ホームページ > データベース > mysql チュートリアル > SQL の「IN」条件が「=」演算子よりも遅い場合があるのはなぜですか?

SQL の「IN」条件が「=」演算子よりも遅い場合があるのはなぜですか?

Mary-Kate Olsen
リリース: 2025-01-16 17:13:08
オリジナル
154 人が閲覧しました

Why is SQL's `IN` Condition Sometimes Slower Than the `=` Operator?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート