EXISTS と IN を使用したサブクエリ: パフォーマンスの最適化
サブクエリを使用する場合、パフォーマンスの最適化が重要です。一般的なサブクエリ メソッドは EXISTS と IN の 2 つで、それぞれに独自の長所と短所があります。この投稿では、これらのメソッド間の主な違いを調べ、パフォーマンスへの影響を示します。
問題ステートメント
次の 2 つのサブクエリは意味的には同等ですが、メソッド1 は方法 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 ) )
パフォーマンスの違い
Explain Plan を分析すると、方法 2 の方が速い理由がわかります。主な違いは、これらのメソッドがサブクエリを処理する方法にあります。
EXISTS の利点
EXISTS を使用すると、IN に比べていくつかの利点があります。特に大規模なサブクエリを扱う場合結果:
IN
の利点は一般に EXISTS の方が優れていますパフォーマンスが高いため、特定のシナリオでは IN が優先される場合があります:
結論
ほとんどの場合、パフォーマンス上の利点と NULL 値の処理により、EXISTS がサブクエリに推奨される方法です。 。ただし、パフォーマンスとクエリ効率を最適化するには、EXISTS と IN のどちらかを選択するときに、特定のユースケースとサブクエリのサイズを考慮することが重要です。
以上がEXISTS と IN サブクエリ: SQL クエリのパフォーマンスを最適化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。