【发布时间】:2011-09-14 12:47:52
【问题描述】:
我有 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 多分钟,但我认为不应该。
谢谢!
【问题讨论】:
-
内部查询需要多长时间才能执行,如果您自己运行它?你能发布 EXPLAIN 的输出吗?
-
请发布您对查询的解释计划,以便人们可以帮助找出不使用索引的原因。基本上看起来您正在为所有用户请求信息(任何地方都没有 WHERE 子句),因此无论如何都必须扫描所有数据。如果单独运行内部选择需要多长时间?