MySQLの「 IN (NOT IN) 」を「EXISTS ( NOT EXISTS)」に置き換えた話

user_groupとuserてtableがある時に、addressにtokyoが入っているuserがいるgroupは何個あるかなー?って時にINを使って

SELECT COUNT(*) FROM user_group WHERE user_id IN ( SELECT id FROM user WHERE address = 'tokyo' );

なんてやると、index張っても速度が全然でないー。

って時は、EXISTSを使うとサクっと取得できる。

SELECT COUNT(*) FROM user_group AS g WHERE EXISTS ( SELECT u.id FROM user AS u WHERE u.address = 'tokyo' AND g.user_id = u.id );

「NOT EXISTS」もあるので、「NOT IN」とか糞重いので修正できそうなら、修正した方がいいかも。

追記

と思ったけど、件数増やすと結局重いな・・。