我有两张桌子:
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 :(得分: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