用于加速此聚合查询的索引或其他数据库

时间:2015-10-15 09:07:26

标签: mysql sql aggregate-functions

我在MySQL表中存储了一个时间序列 [int(11)int(11)] 第一列是以毫秒为单位的纪元时间,第二列是当时的值。

有25920000条记录。 当我想绘制数据时,我不想绘制每毫秒但仅在某个分辨率下绘图,我使用以下查询:

每天平均值

 SELECT AVG(value) FROM measurements GROUP BY ts DIV (1000*60*60*24)

这需要1.5分钟,这比我想要的时间长。

我是否可以使用某个索引来加速此查询?

或者是否有其他DBMS更适合这种情况。

根据评论中的要求:

原创CREATE TABLE

CREATE TABLE measurements (ts INT(11), value INT(11))

样本值

15151,11
15152,15
15153,50
15154,100
....

请注意,我目前正在试验整数数据,将来它将是浮点数据

2 个答案:

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

为了加快速度(并确保索引可能成功使用),您可以为分辨率添加不同的列,并从时间戳值中预先计算这些列。 之后,将索引添加到此(这些)列,它应该更快,因为您不必在分组之前计算所有值。

我知道它不是最灵活的方式,但可能是一个很好的权衡。

编辑:如果您填写此表,您还可以立即预先计算这些值,因此无需重新计算大量数据。