2011-09-14 112 views
2

我有2個表:LEFT JOIN與GROUP_CONCAT太慢

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 

雖然有效,但速度很慢。我在組表中有4萬用戶和26萬條記錄。 看起來像查詢不使用索引並遍歷每個用戶的所有260k行。

有什麼辦法讓它更快?它需要3分鐘以上,但我認爲它不應該。

謝謝!

+0

多長時間內查詢取來執行,如果你對自己的運行呢?你可以發佈EXPLAIN的輸出嗎? –

+0

請發佈您的查詢解釋計劃,以便人們可以幫助找出爲什麼不使用索引。基本上,它看起來像你要求所有用戶的信息(任何地方沒有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