MySQL-大表上的按日期/时间分组函数

MySQL-大表上的按日期/时间分组函数,mysql,Mysql,我在MySQL表中有一堆金融股票数据。数据以每行1分钟刻度的格式(OHLC)存储。根据这些数据,我想创建30分钟/小时/天的聚合。表太大,并且在时间戳列上按日期函数分组,这一问题会导致糟糕的性能结果 例:下面的查询生成正确的结果,但结果太长 SELECT market, max(timestamp) AS TS FROM tbl_data GROUP BY market, DATE(timestamp), HOUR(timestamp) ORDER BY market, TS ASC 该表

我在MySQL表中有一堆金融股票数据。数据以每行1分钟刻度的格式(OHLC)存储。根据这些数据,我想创建30分钟/小时/天的聚合。表太大,并且在时间戳列上按日期函数分组,这一问题会导致糟糕的性能结果

例:下面的查询生成正确的结果,但结果太长

SELECT market, max(timestamp) AS TS 
FROM tbl_data 
GROUP BY market, DATE(timestamp), HOUR(timestamp)
ORDER BY market, TS ASC
该表在(市场、时间戳)列上有一个主索引。我还在timestamp列上添加了一个额外的索引。然而,这并没有多大帮助,因为使用日期/小时函数意味着不管怎样都要进行表扫描

如何提高性能?也许我应该考虑不同的数据库,而不是提供专门的日期/时间索引的MySQL?如果是的话,什么是一个好的选择

需要注意的一点是,如果我能得到每个小时/天/时间段的最后一行,就足够了。数据库有数千万行

MySQL版本:5.7

提前谢谢你的帮助

编辑:以下是Explain在完全相同格式的较小DB上显示的内容:


什么是
解释[qeury]
说的?MySQL版本是什么?很抱歉没有包括这个。我在一个较小的数据库上运行相同的查询只是为了测试,但结果是相同的:MYSQL版本:5.7 qeury使用完全覆盖索引扫描。您可以在额外列中查看“按类型索引”和“使用索引”。使用临时设备;MySQL将创建一个临时MyISAM内存表来保存结果。如果临时MyISAM内存表变大,它将转换为基于磁盘的临时MyISAM。filesort实际上是一个错误的名称,它实际上是一个快速排序算法,将在临时内存表或临时磁盘表上运行,以进行结果排序。你真的需要订购结果吗?如果没有,您可以使用
ORDER BY NULL禁用ORDER BY
,也许您应该在插入时将时间戳拆分为单独的字段。这样,您就不需要在
选择期间为每一行调用
DATE()
HOUR()
函数。这应该会加快一点速度,但只有一个实验才能告诉你到底有多快。