ホームページ > データベース > mysql チュートリアル > MySQL の「IN」演算子は、値が 1 つであっても「=」よりも遅いのはなぜですか?

MySQL の「IN」演算子は、値が 1 つであっても「=」よりも遅いのはなぜですか?

Linda Hamilton
リリース: 2025-01-16 17:38:11
オリジナル
967 人が閲覧しました

Why is MySQL's `IN` operator slower than `=` even with a single value?

MySQL クエリのパフォーマンス例外: IN 演算子と等号演算子のパフォーマンスの違い

問題の説明

MySQL では、IN 条件を使用した SELECT クエリのパフォーマンスは、等号 (=) 演算子を使用した同じクエリよりも大幅に低下します。 IN 条件に単一の値しか含まれていない場合でも、パフォーマンスの違いは大きくなる可能性があります。

説明

この問題は、MySQL 5.6.x で修正された MySQL の最適化の欠陥に起因します。この問題は、IN 条件を含むサブクエリが独立サブクエリではなく依存サブクエリとして誤って分類された場合に発生します。

依存サブクエリと独立サブクエリ

  • 依存サブクエリ: 外側のクエリの行ごとに、依存サブクエリが 1 回実行され、複数の計算が行われます。
  • 独立したサブクエリ: は、外側のクエリの行数に関係なく、1 回だけ実行されます。

クエリ分析のサンプル

次のクエリ例は、この異常を示しています。

<code class="language-sql">SELECT *
FROM question_law_version
WHERE id IN (
    SELECT MAX(foo_id)
    FROM bar
)</code>
ログイン後にコピー

このクエリを実行すると、サブクエリは依存サブクエリとして扱われるため、パフォーマンスが低下します。ただし、IN を = に置き換えると依存関係が削除され、パフォーマンスが大幅に向上します。

クエリプランの比較

EXPLAIN コマンドを使用してクエリ プランを検査すると、違いが明らかになります。

  • 状態:
    • 'PRIMARY' 'question_law_version' 'ALL' '' '' '' '' 10148 'where の使用'
    • 'DEPENDENT SUBQUERY' 'question_law_version' 'ALL' '' '' '' '' 10148 'where の使用'
    • 'DEPENDENT SUBQUERY' 'question_law' 'ALL' '' '' '' 10040 'where の使用'
  • 等号条件:
    • 'PRIMARY' 'question_law_version' 'ALL' '' '' '' '' 10148 'where の使用'
    • 'SUBQUERY' 'question_law_version' 'ALL' '' '' '' '' 10148 'where の使用'
    • 'SUBQUERY' 'question_law' 'ALL' '' '' '' 10040 'where の使用'

= 演算子を使用したクエリ プランには「DEPENDENT SUBQUERY」が存在しないことに注意してください。

以上がMySQL の「IN」演算子は、値が 1 つであっても「=」よりも遅いのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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