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

MySQL で WHERE 句でサブクエリを使用すると非常に遅いのはなぜですか?

Mary-Kate Olsen
リリース: 2024-11-22 16:09:11
オリジナル
648 人が閲覧しました

Why Is Using a Subquery in the WHERE Clause So Slow in MySQL?

MySQL パフォーマンスへの影響: WHERE 句のサブクエリ

重複データを扱う場合、問題のある行を特定して検査する必要があります。ただし、WHERE 句でサブクエリを使用する単純なクエリでは、重大なパフォーマンスの問題が発生する可能性があります。

元のクエリ:

SELECT *
FROM some_table 
WHERE relevant_field IN
(
    SELECT relevant_field
    FROM some_table
    GROUP BY relevant_field
    HAVING COUNT(*) > 1
)
ログイン後にコピー

relevant_field のインデックスにもかかわらず、これはクエリの実行が非常に遅い。その理由は、サブクエリの相関特性にあります。

相関サブクエリとパフォーマンス:

相関サブクエリは、外部クエリの列を参照するサブクエリです。この場合、サブクエリはテーブル内で複数回出現する RELATED_FIELD 値を選択します。外側のクエリの行ごとにサブクエリが実行され、同じクエリが複数回実行されます。これにより、パフォーマンスが低下します。

解決策としての非相関サブクエリ:

パフォーマンスの問題を解決するには、相関サブクエリを非相関サブクエリに変換することをお勧めします。 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
)
ログイン後にコピー

このクエリの実行速度が大幅に向上しました。サブクエリが関連付けられなくなったためです。 1 回の実行で複数回発生する RELATED_FIELD 値を計算し、それらをサブクエリ エイリアスに保存し、メイン クエリで使用します。

結論:

相関サブクエリと非相関サブクエリの違いを理解することは、MySQL のパフォーマンスを最適化するために重要です。相関サブクエリを非相関サブクエリに変換すると、WHERE 句のサブクエリに依存するクエリの速度が大幅に向上します。

以上がMySQL で WHERE 句でサブクエリを使用すると非常に遅いのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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