MySQL で重複行を検索するときに「WHERE IN (Subquery)」を使用するとパフォーマンスの問題が発生するのはなぜですか?

Linda Hamilton
リリース: 2024-11-22 10:20:10
オリジナル
451 人が閲覧しました

Why does using `WHERE IN (Subquery)` lead to performance issues in MySQL when searching for duplicate rows?

MySQL - SELECT WHERE Field IN (サブクエリ) パフォーマンスの低下

データベースでは、サブクエリを使用して重複行を検出することが効率的なアプローチとなる場合があります。ただし、重複するフィールド値を持つすべての行を取得しようとすると、WHERE IN (サブクエリ) クエリで重大なパフォーマンスの問題が発生する可能性があります。この速度低下の理由を理解すると、クエリの最適化に役立ちます。

相関サブクエリとその影響

このシナリオでのパフォーマンス低下の理由は、相関サブクエリの使用にあります。サブクエリ。相関サブクエリは親クエリの値を参照します。つまり、サブクエリは親クエリで処理される行ごとに 1 回実行されます。提供されたクエリ:

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

サブクエリは、some_table 内の重複したフィールド値を返します。外側のクエリは、some_table の各行を処理するときに、relevant_field の値をサブクエリによって返された値と比較します。サブクエリは重複するフィールド値ごとに複数の行を返すため、この比較ではサブクエリを複数回実行する必要があり、実行時間が長くなります。

相関サブクエリのアドレス指定

解決するには相関サブクエリによって引き起こされるパフォーマンスの問題については、サブクエリを非相関クエリに変換できます。これは、サブクエリ内のすべての列を選択し、それを外側のクエリのテーブルとして使用することによって実現されます。

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

サブクエリ内のすべての列を選択すると、親クエリの値から独立し、重複するフィールド値をすべて返すために 1 回実行できます。

改良されたクエリパフォーマンス

非相関サブクエリを使用すると、パフォーマンスの問題を回避しながら some_table 内のすべての重複行を取得する変更されたクエリは次のようになります。

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 (Subquery)」を使用するとパフォーマンスの問題が発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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