2011-09-14 24 views
2

遅すぎる:は、私は2つのテーブル持って

users (id, firstname, lastname, etc) 
users_to_groups (user_id(index), group_id(index)) 

を私は次のようなレコードを返すクエリを作成したいと思います:

firstname lastname groups 
John  Smith  1,2,3,5 
Tom   Doe   3,5 

私はGROUP_CONCAT機能を使用し、現在、私のクエリは:

SELECT * FROM users 
LEFT OUTER JOIN 
(
    SELECT user_id, group_concat(group_id) FROM users_to_groups GROUP BY user_id 
) AS i 
ON users.id = i.user_id 

ですが、動作は遅くなります。私はグループテーブルに40kユーザーと260kレコードを持っています。 クエリはインデックスを使用せず、すべてのユーザーに対して260kの行をすべて通過するように見えます。

もっと速くする方法はありますか? 3分以上かかりますが、そうしてはいけないと思います。

ありがとうございます!

+0

あなたが自分自身でそれを実行した場合どのくらい内側のクエリは、実行に時間がかかりますか?あなたはEXPLAINの出力を投稿できますか? –

+0

索引が使用されない理由を人々が理解できるように、照会のExplain計画を掲載してください。基本的には、すべてのユーザーの情報を要求しているようです(WHERE句はどこにもありません)ので、すべてのデータをスキャンする必要があります。単独で実行するとインナーセレクトにかかる時間はどれくらいですか? – Galz

答えて

5

試してみてください。

SELECT 
    u.user_id, u.firstname, u.lastname, group_concat(g.group_id) 
    FROM users       u 
     LEFT OUTER JOIN users_to_groups g ON u.id on g.user_id 
    GROUP BY u.id, u.firstname, u.lastname 
3

それは左が参加していないですが、サブは選択それはあなたのクエリが遅くなります。 MySQLはサブ選択になると本当に吸う。

これはより速く、おそらくです:

SELECT 
    u.id, u.firstname, u.lastname, 
    group_concat(ug.group_id) AS groups 
FROM 
    users u 
    LEFT JOIN users_to_groups ug ON ug.user_id = u.id 
GROUP BY 
    u.id, u.firstname, u.lastname 
+0

恐ろしい!それは本当に速いです。本当にありがとう! – sydo

+0

今はどのくらいかかりますか?それはちょうど好奇心です... – GoRoS

+0

それは約4秒です.. – sydo

関連する問題