我怎么做它所以我不必查询百万+时间戳

时间:2016-03-11 16:53:26

标签: mysql time-series

问题的快速概要:

我正在使用图表页面来映射我公司正在处理的设备的性能。 我每2秒获得一个新的statpoint(timestamp,stats,nodeid,volumeid,clusterid)。来自每个节点。

这导致每个节点每个节点每天大约43,000条记录。 现在让我们说我有13个统计数据。这是每天520k的记录。

所以一行看起来像是:

timestamp                typeid    clusterid    nodeid    volumeid    value
01/02/2016   05:02:22    0         1            1         1           82.20

如此简短的解释,我们决定使用mysql,因为它可以在亚马逊中轻松扩展。我之前使用Influx可以很容易地解决这个问题但是没有办法在亚马逊中自动扩展InfluxDB。

我的最终目标是获得一个看起来像的返回值:

object[ {
    node1-stat1: 20.0,
    node2-stat1: 23.2,
    node3-stat1: xx.x,
    node1-stat2: 20.0
    node2-stat2: xx.x,
    node3-stat2: xx.x,
    timestamp: unixtimestamp
},
{
    node1-stat1: 20.0,
    node2-stat1: 23.2,
    node3-stat1: xx.x,
    node1-stat2: 20.0
    node2-stat2: xx.x,
    node3-stat2: xx.x,
    timestamp: unixtimestamp + 2 seconds
}]

我目前有一个收集所有唯一时间戳的查询。 然后循环遍历那些以获取属于该时间戳的值。 把它放进一个物体里。

这会产生所需的输出。但它需要永远这样做,并且它超过一百万个查询。

这样的事情甚至可以在Mysql中完成吗?我应该回到时间序列数据库吗?并且只是手动处理它?<​​/ p>

//编辑//

我想我可能已经解决了我的问题:

SELECT data_points.*, data_types.friendly_name as friendly_name 
FROM data_points, data_types  
WHERE (cluster_id = '5' 
AND data_types.id = data_points.data_type_id
AND unix_timestamp(timestamp) BETWEEN '1456387200' AND '1457769599')         
ORDER BY timestamp, friendly_name, node_id, volume_id

给我所有需要的领域。 然后我循环遍历这些数据点。并为每个时间戳创建一个新的“对象”,只需为所有与时间戳匹配的对象添加统计数据。

这将在一秒钟内执行超过一百万条记录。

我肯定会尝试查看交换到Timeseries数据库是否会在将来有所改进。

0 个答案:

没有答案