WHERE IN のサブクエリによる MySQL のパフォーマンスの低下
MySQL データベース内の重複行を識別して検査しようとすると、一見単純なクエリが結果として生成されました。予想外にパフォーマンスが遅い。最初のクエリは、「relevant_field」列に重複する値を持つすべての行を選択することを目的としており、次の構造を使用しました:
SELECT relevant_field FROM some_table GROUP BY relevant_field HAVING COUNT(*) > 1
このクエリはすぐに実行されましたが、後続のクエリが構築されたときに、次の構造が使用されました。最初のクエリの値と一致する 'relevant_field' 値を持つ 'some_table' では、パフォーマンスが大幅に低下しました。
SELECT * FROM some_table WHERE relevant_field IN ( SELECT relevant_field FROM some_table GROUP BY relevant_field HAVING COUNT(*) > 1 )
パフォーマンスの低下は、相関クエリとしてのサブクエリの性質に起因する可能性があります。この場合、メイン クエリによって処理される行ごとにサブクエリが実行されるため、過剰なオーバーヘッドが発生します。
このパフォーマンスの問題を軽減するには、次を選択して相関サブクエリを非相関サブクエリに変換すると効果的です。サブクエリのすべての列。
SELECT * FROM ( SELECT relevant_field FROM some_table GROUP BY relevant_field HAVING COUNT(*) > 1 ) AS subquery
この変更を行うことで、メイン クエリのパフォーマンスが大幅に向上します。
SELECT * FROM some_table WHERE relevant_field IN ( SELECT * FROM ( SELECT relevant_field FROM some_table GROUP BY relevant_field HAVING COUNT(*) > 1 ) AS subquery )
この改訂されたクエリは、MySQL の最適化機能を利用して効率的に重複を取得します。元の相関サブクエリに関連付けられたパフォーマンス ペナルティのない行。
以上がWHERE IN にサブクエリを含む MySQL クエリが非常に遅いのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。