使用group by缓慢查询

时间:2013-06-04 01:32:26

标签: mysql group-by indexing performance

当我运行以下查询时,我会慢一些(~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”。

我对如何避免这种情况感到茫然。

我们需要能够对伤害表中的任何字段进行分组,因此索引每个组合可能不是一个好的解决方案。

有什么想法吗?

1 个答案:

答案 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