【发布时间】:2016-01-09 00:17:21
【问题描述】:
简化但我有三个表:
- 用户(user_id、team_id)
- 结果(user_id,结果)
- user_signups (user_id, team_id, event_id)
results.user_id 是外键。
表格中有大量行。如果我这样做了
select sum(result)
from results
inner join users on users.id = results.user_id
group by team_id
速度很快。 “解释”的结果有 150k 行,用户有 1 行。
如果我这样做
select sum(result)
from results
inner join user_signups on user_signups.user_id = results.user_id
where event_id = 1
group by team_id
它非常慢(从 1 秒到 14 秒)。 “解释”的结果有 28 行,user_signups 有 5345 行。
我尝试过的事情:
user_signups 上 event_id 和 user_id 的唯一索引。
user_signups 上 event_id、user_id、team_id 的索引。
改写为
select sum(result)
from results
inner join (select * from user_signups where event_id = 1) user_signups on user_signups.user_id = results.user_id
group by team_id
改写为
select sum(result)
from results
inner join users on users.id = results.user_id
inner join user_signups on user_signups.user_id = users.id
where event_id = 1
group by user_signups.team_id
还有其他建议吗?
【问题讨论】:
-
请确定每个表上的现有索引,并建议您在问题中显示解释计划结果,示例数据和预期结果也会有所帮助(也许设置一个 sqlfiddle?sqlfiddle.com)
-
去阅读一些关于mysql查询优化的其他问题。通常,当他们没有架构的详细信息和解释计划时,他们会被否决或回答不佳。
-
请为每张桌子提供
SHOW CREATE TABLE。