与group_concat的左连接太慢了

时间:2011-09-14 12:47:53

标签: mysql sql

我有两张桌子:

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分钟以上,但我认为不应该。

谢谢!

2 个答案:

答案 0 :(得分:6)

尝试:

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

答案 1 :(得分:4)

这不是左连接,而是使查询变慢的子选择。当涉及到sub select时,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