对于我的情况,我需要捕获设备的15个性能指标,并将其保存到InfluxDB。每个设备具有唯一的设备id。
指标通过以下方式写入InfluxDB。这里我只展示一个示例
new Serie.Builder("perfmetric1")
.columns("time", "value", "id", "type")
.values(getTime(), getPerf1(), getId(), getType())
.build()写入数据既快又容易。但是当我运行query时,我发现性能很差。我正在尝试获取过去一小时内的所有15个度量值。
select value from perfmetric1, perfmetric2, ..., permetric15
where id='testdeviceid' and time > now() - 1h在一个小时内,每个指标有120个数据点,总共是1800个数据点。当c4.4xlarge EC2实例空闲时,查询大约需要5秒。
我相信InfluxDB可以做得更好。这是我的模式设计的问题,还是其他问题?将查询拆分为15个并行调用会更快吗?
发布于 2015-05-11 15:47:35
正如@valentin answer所说,您需要为InfluxDB的id列构建一个索引,以便高效地执行这些查询。
在0.8稳定版中,你可以使用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的点。
发布于 2015-04-25 06:11:05
在id列上建立索引。似乎引擎使用了对表的完全扫描来检索数据。如果将查询拆分成15个线程,引擎将使用15次完整扫描,性能将会差得多。
https://stackoverflow.com/questions/29858328
复制相似问题