mysqlでサブクエリ中にgroup byしてると重い
EXPLAIN SELECT * FROM user_master WHERE user_id IN ( SELECT user_id FROM game_user_status);
だと、以下のような感じ
+----+--------------------+------------------+-----------------+---------------+---------+---------+------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+--------------------+------------------+-----------------+---------------+---------+---------+------+------+-------------+ | 1 | PRIMARY | user_master | ALL | NULL | NULL | NULL | NULL | 86 | Using where | | 2 | DEPENDENT SUBQUERY | game_user_status | unique_subquery | PRIMARY | PRIMARY | 4 | func | 1 | Using index | +----+--------------------+------------------+-----------------+---------------+---------+---------+------+------+-------------+
86*1 まぁ普通だよね
ただ、サブクエリ中でGROUP BYすると酷いことになった
EXPLAIN SELECT * FROM user_master WHERE user_id IN ( SELECT user_id FROM game_user_status GROUP BY user_id);
+----+--------------------+------------------+-------+---------------+---------+---------+------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+--------------------+------------------+-------+---------------+---------+---------+------+------+-------------+ | 1 | PRIMARY | user_master | ALL | NULL | NULL | NULL | NULL | 86 | Using where | | 2 | DEPENDENT SUBQUERY | game_user_status | index | NULL | PRIMARY | 4 | NULL | 67 | Using index | +----+--------------------+------------------+-------+---------------+---------+---------+------+------+-------------+
GROUP BYすると
86*67
ナニコレ
なんで増えんのよ・・・
追記09/10/16 06:20
と思ったらこんなんあったんだね
MySQLは内部的にINを直接処理することができないので、EXISTSに変換することでSQL的には相関のないサブクエリも相関サブクエリになってしまうのである。これがまさにMySQLのサブクエリが遅い!と言われている原因だろう。
http://nippondanji.blogspot.com/2009/03/mysql_25.html
だからってGROUP BY使っただけでそこまでしなくても・・・
ってもINで検索する際に同一user_idがあっても検索結果に変わりは無いのでGROUP BY外せば良いだけなんですけどね
ただ、心情的にGROUP BY使いたくなる気持ちもわかる