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秒だった