ホームページ > データベース > mysql チュートリアル > MySQL サブクエリで「IN」が「=」よりも遅いのはなぜですか?

MySQL サブクエリで「IN」が「=」よりも遅いのはなぜですか?

Patricia Arquette
リリース: 2025-01-16 17:18:12
オリジナル
383 人が閲覧しました

Why is `IN` slower than `=` in MySQL subqueries?

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

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