ホームページ > データベース > mysql チュートリアル > WHERE IN にサブクエリを含む MySQL クエリが非常に遅いのはなぜですか?

WHERE IN にサブクエリを含む MySQL クエリが非常に遅いのはなぜですか?

Linda Hamilton
リリース: 2024-11-15 15:54:03
オリジナル
479 人が閲覧しました

Why is My MySQL Query with a Subquery in WHERE IN So Slow?

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

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