サブクエリを使う場合のパフォーマンス低下 – MySQL サブクエリ IN

 WHERE句でINを使ってサブクエリを構築する場合

SELECT * FROM main_table WHERE id IN (SELECT main_id FROM sub_table WHERE date=’2011-12-21′ GROUP BY main_id) AND type=1

 みたいに書くとパフォーマンスが低下する。
 メインテーブルの条件になるmain_idをグループにすると重複が無くなって良さそうな感じがするんだけど、このGROUP BYをするとインデックス動作が低速化するので、GROUP BY main_idを除去する方が良い。
 サブクエリの戻り値が複数あっても、結局、INを展開するとid=1 OR id=1 OR id=2みたいな事になるんで、JOINした場合と違って論理的に被らないので、こういったグループ化はしない方が良い。
 また、関数を使って値を処理した場合にもインデックスが動作せずにクエリが著しく低下するので、インデックスが動作する形でSELECTして、プログラム側で処理をした方が高速なこともあるのに注意したい。

(17)


カテゴリー: LAMP[Linux, Apache, MySQL, PHP]   パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です