みずの日記

ボカロとかニコ動とか忘備録とか

SQLサブクエリ覚え書き

あるテーブルのユーザー一覧の中で、関連付いてる別テーブルに列がいくつあるか調べる。

SELECT id, username
FROM dx_users
WHERE id IN
 (SELECT user_id FROM alias GROUP BY user_id
  HAVING COUNT(user_id) > 2)

始めてサブクエリ使ったよママン

しかし、処理に0.8秒とかかかるw
これ、テスト鯖だからいけるけど、本鯖に移したらどれだけ負荷かかるんだ・・・。

ってことで調べたら、MySQLはINを使うと総当たり計算するらしい・・・。

id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY dx_users ALL NULL NULL NULL NULL 625 Using where
2 DEPENDENT SUBQUERY alias ALL NULL NULL NULL NULL 482 Using temporary; Using filesort

625*482回って・・・(301250回)
ってか、ユーザーが増えたら絶望的だなこの計算・・・。

で、グーグル先生に質問したら教えてくれた。

SELECT id, username, cnt
FROM dx_users, 
 (SELECT user_id, count(alias.user_id) as cnt FROM alias GROUP BY user_id
  HAVING COUNT(user_id) > 2) al
WHERE dx_users.id=al.user_id

に変えて計算すると、

id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY ALL NULL NULL NULL NULL 14
1 PRIMARY dx_users eq_ref PRIMARY PRIMARY 4 al.user_id 1
2 DERIVED alias ALL NULL NULL NULL NULL 482 Using temporary; Using filesort

14*1*482回で済んでるっぽい・・・(6748回)
ちなみに計算時間は0.003秒だった