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使いたくなる気持ちもわかる