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