按日期分组MYSQL结果行

按日期分组MYSQL结果行,mysql,performance,group-by,Mysql,Performance,Group By,我想按时间戳的小时数对从MYSQL数据库获取的结果进行分组。时间戳以2012-12-14 03:19:09格式存储在表中。我使用这个查询 SELECT HOUR(`timestamp`) AS `hour`, AVG(`somevalue`) AS `average` FROM ... GROUP BY HOUR(`timestamp`), DAY(`timestamp`), MONTH(`timestamp`), WEEK(`timestamp`

我想按时间戳的小时数对从MYSQL数据库获取的结果进行分组。时间戳以
2012-12-14 03:19:09
格式存储在表中。我使用这个查询

SELECT
    HOUR(`timestamp`) AS `hour`,
    AVG(`somevalue`) AS `average`
FROM ...
GROUP BY
    HOUR(`timestamp`),
    DAY(`timestamp`),
    MONTH(`timestamp`),
    WEEK(`timestamp`),
    YEAR(`timestamp`)
ORDER BY ...
LIMIT 0, 24;
这将起作用,并返回正确的行和值

+------+-------+
| hour | value |
+------+-------+
| 13   | 21.16 | 
| 12   | 21.11 |
| 11   | 20.88 |
| 10   | 20.93 |
|  9   | 20.87 |
|  8   | 20.89 |
| ...  | ...   |
+------+-------+ 
。。。但速度非常慢(表包含约90k行)。我不是按每个日期实体分组,而是按
UNIX\u时间戳(`TIMESTAMP`)/3600
分组。不幸的是,这并没有得到期望的结果,结果如下

+------+-------+
| hour | value |
+------+-------+
| 13   | 21.20 |
| 13   | 21.20 |
| 13   | 21.20 |
| 13   | 21.20 |
| 13   | 21.20 |
| ...  | ...   |
+------+-------+ 
有没有办法只通过一个group子句对它们进行分组(这将使其更快),但返回正确的结果

  • 索引时间戳列
  • 尝试
    按日期分组\u格式(时间戳,%Y%m%d%H')

  • 请注意,我自己并没有真正尝试过这一点。

    使用“按日期和时间分组”代替

    SELECT
        HOUR(`timestamp`) AS `hour`,
        AVG(`somevalue`) AS `average`
    FROM ...
    GROUP BY
        DATE(`timestamp`),
        HOUR(`timestamp`),
    ORDER BY ...
    LIMIT 0, 24;
    

    在这里使用多个反勾号对我来说不起作用(见上文)。如果有人发现了这个错误,我非常感谢您的纠正。使用当前模式解决这个问题的任何尝试都不会避免完整的表扫描和文件排序,因此对于大型表来说,这将非常昂贵。您需要更改架构,以便可以在索引上分组,例如,将
    DATE_格式(时间戳,%Y-%m-%d%H:00:00')
    存储在另一个(索引)列中。没有性能改进:1.5021,而不是我的机器上的1.4012秒(大约增加7%)。看起来很有希望:是1.4012秒,现在是0.9345秒。快了三分之一!