我在MySQL表中存储了一个时间序列 [int(11)int(11)] 第一列是以毫秒为单位的纪元时间,第二列是当时的值。
有25920000条记录。 当我想绘制数据时,我不想绘制每毫秒但仅在某个分辨率下绘图,我使用以下查询:
SELECT AVG(value) FROM measurements GROUP BY ts DIV (1000*60*60*24)
这需要1.5分钟,这比我想要的时间长。
我是否可以使用某个索引来加速此查询?
或者是否有其他DBMS更适合这种情况。
根据评论中的要求:
CREATE TABLE measurements (ts INT(11), value INT(11))
15151,11
15152,15
15153,50
15154,100
....
请注意,我目前正在试验整数数据,将来它将是浮点数据
答案 0 :(得分:2)
您还可以使用 PERSISTENT 列,这些列将动态生成日期并且还有一个索引
CREATE TABLE `measurements ` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`datum` date AS (DATE(ts)) PERSISTENT,
`ts` int(11) DEFAULT NULL,
`value` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `datum` (`datum`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
答案 1 :(得分:1)
为了加快速度(并确保索引可能成功使用),您可以为分辨率添加不同的列,并从时间戳值中预先计算这些列。 之后,将索引添加到此(这些)列,它应该更快,因为您不必在分组之前计算所有值。
我知道它不是最灵活的方式,但可能是一个很好的权衡。
编辑:如果您填写此表,您还可以立即预先计算这些值,因此无需重新计算大量数据。