就我而言,我需要为设备捕获15个性能指标并将其保存到InfluxDB.每个设备都有唯一的设备ID. 度量标准以下列方式写入InfluxDB.这里我只展示一个例子 new Serie.Builder("perfmetric1") .columns("time",
度量标准以下列方式写入InfluxDB.这里我只展示一个例子
new Serie.Builder("perfmetric1") .columns("time", "value", "id", "type") .values(getTime(), getPerf1(), getId(), getType()) .build()
编写数据既快速又简单.但是当我运行查询时,我看到了糟糕的性能.我正在尝试获取最后一小时的所有15个指标值.
select value from perfmetric1, perfmetric2, ..., permetric15 where id='testdeviceid' and time > now() - 1h
一个小时,每个指标有120个数据点,总共有1800个数据点.当c4.4xlarge EC2实例空闲时,查询大约需要5秒钟.
我相信InfluxDB可以做得更好.这是我的架构设计的问题,还是别的什么?将查询分成15个并行调用会更快吗?
正如@valentin的回答所说,您需要为InfluxDB的id列构建一个索引,以便有效地执行这些查询.在0.8 stable中,您可以使用continuous fanout queries进行“索引”.例如,以下连续查询会将perfmetric1系列扩展为perfmetric1.id形式的多个系列:
select * from perfmetric1 into perfmetric1.[id];
稍后你会做:
select value from perfmetric1.testdeviceid, perfmetric2.testdeviceid, ..., permetric15.testdeviceid where time > now() - 1h
此查询将花费更少的时间来完成,因为InfluxDB不必执行时间序列的完整扫描来获取每个testdeviceid的点数.