MySQL での EXISTS と IN を使用したサブクエリ: パフォーマンスの最適化
MySQL でサブクエリを使用する場合、2 つの一般的なアプローチがあります。IN を使用する演算子を使用し、EXISTS 演算子を使用します。どちらの方法でも同様の結果が得られますが、パフォーマンスには大きな違いが見られます。
次の 2 つのサブクエリの例を考えてみましょう。
メソッド 1 (IN):
SELECT * FROM tracker WHERE reservation_id IN ( SELECT reservation_id FROM tracker GROUP BY reservation_id HAVING ( method = 1 AND type = 0 AND Count(*) > 1 ) OR ( method = 1 AND type = 1 AND Count(*) > 1 ) OR ( method = 2 AND type = 2 AND Count(*) > 0 ) OR ( method = 3 AND type = 0 AND Count(*) > 0 ) OR ( method = 3 AND type = 1 AND Count(*) > 1 ) OR ( method = 3 AND type = 3 AND Count(*) > 0 ) )
方法 2 (EXISTS):
SELECT * FROM `tracker` t WHERE EXISTS ( SELECT reservation_id FROM `tracker` t3 WHERE t3.reservation_id = t.reservation_id GROUP BY reservation_id HAVING ( METHOD = 1 AND TYPE = 0 AND COUNT(*) > 1 ) OR ( METHOD = 1 AND TYPE = 1 AND COUNT(*) > 1 ) OR ( METHOD = 2 AND TYPE = 2 AND COUNT(*) > 0 ) OR ( METHOD = 3 AND TYPE = 0 AND COUNT(*) > 0 ) OR ( METHOD = 3 AND TYPE = 1 AND COUNT(*) > 1 ) OR ( METHOD = 3 AND TYPE = 3 AND COUNT(*) > 0 ) )
問題文で述べたように、方法 1 の実行には方法 2 よりも大幅に時間がかかります。これは、2 つのアプローチのサブクエリの処理方法に根本的な違いがあるためです。
IN 演算子:
IN 演算子を使用すると、MySQL が実行されますサブクエリを複数回 (メイン クエリの行ごとに 1 回) 実行します。この場合、トラッカー テーブルの行ごとにサブクエリが実行され、指定された基準を満たしているかどうかが判断されます。これは、特にサブクエリが複雑であるか、大量のデータが含まれている場合に、重大なパフォーマンスのオーバーヘッドにつながる可能性があります。
EXISTS 演算子:
対照的に、EXISTS 演算子はサブクエリを 1 回だけ実行します。メイン クエリの現在の行に対するサブクエリの結果に一致する行が少なくとも 1 つあるかどうかを確認します。一致する場合、EXISTS 条件は true として評価されます。それ以外の場合は false です。このアプローチは、サブクエリからすべての行を複数回取得する必要がなくなるため、はるかに効率的です。
IN と EXISTS の選択:
一般的には、次のようになります。ほとんどの場合、パフォーマンスが向上するため、可能な限り EXISTS 演算子を使用することをお勧めします。正しい選択をするためのガイドラインをいくつか示します。
追加の考慮事項:
以上がMySQL サブクエリ: 最適なパフォーマンスを得るには、いつ EXISTS と IN を使用する必要がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。