当我运行以下查询时,我会慢一些(~6s):
SELECT sql_no_cache
t1.id, t2.id, count(injury.id)
FROM age_group as t1
CROSS JOIN body_part as t2
LEFT JOIN injury
ON t1.id = injury.age_group_id
AND t2.id = injury.body_part_id
GROUP BY t1.id,t2.id
如果我删除了GROUP BY
,那么它会很快执行。
当我使用EXPLAIN
时,唯一的区别在于GROUP BY
是否列出了“使用索引;使用临时;使用filesort”。
我对如何避免这种情况感到茫然。
我们需要能够对伤害表中的任何字段进行分组,因此索引每个组合可能不是一个好的解决方案。
有什么想法吗?
答案 0 :(得分:0)
您可以在没有联接的情况下进行聚合:
select injury.age_group_id, injury.body_part_id, count(*)
from injury
group by injury.age_group_id, injury.body_part_id
这只会在受伤的情况下返回结果。
如果这表现良好,那么之后再进行加入:
select t.id, t2.id, coalesce(injury.cnt, 0)
from age_group as t1 CROSS JOIN
body_part as t2 left outer join
(select injury.age_group_id, injury.body_part_id, count(*) as cnt
from injury
group by injury.age_group_id, injury.body_part_id
) injury LEFT JOIN
injury ON t1.id = injury.age_group_id and t2.id = injury.body_part_id