【问题标题】:Slow query with group bygroup by 慢查询
【发布时间】:2013-05-30 07:05:59
【问题描述】:

当我运行以下查询时,速度有些慢(约 6 秒):

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 列出了“使用索引;使用临时;使用文件排序”。

我不知道如何避免这种情况。

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

有什么想法吗?

【问题讨论】:

    标签: mysql group-by indexing performance


    【解决方案1】:

    你可以在没有连接的情况下进行聚合:

    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
    

    【讨论】:

    • 您的答案是正确的,但我不确定为什么它更快。 EXPLAIN 仍然显示“使用临时;使用文件排序”,这是我对查询速度慢的原因的理解。我认为这是因为结果表只有三列,但如果将其更改为包含所有列,但它仍然一样快。
    • @user2449882 。 . .我认为原因是因为它是在join之前进行聚合,所以数据量较小。
    猜你喜欢
    • 2021-11-17
    • 2018-09-07
    • 1970-01-01
    • 2017-07-13
    • 2021-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多