InfluxDB性能

5

针对我的情况,我需要捕获设备的15个性能指标,并将其保存到InfluxDB中。每个设备都有一个唯一的设备ID。

指标以以下方式写入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个并行调用是否会更快?

2个回答

4
作为@valentin的回答所说,你需要为InfluxDB的id列建立索引以便高效地执行这些查询。
在0.8稳定版本中,你可以使用连续分支查询来进行这种“索引”。例如,以下连续查询将会将你的perfmetric1系列扩展为多个形如perfmetric1.id的系列:
select * from perfmetric1 into perfmetric1.[id];

以后你会执行以下操作:
select value from perfmetric1.testdeviceid, perfmetric2.testdeviceid, ..., permetric15.testdeviceid where time > now() - 1h

由于InfluxDB不必对每个testdeviceid执行完整的时间序列扫描以获取每个点,因此此查询将花费更少的时间来完成。


2

在id列上建立索引。似乎引擎使用全表扫描来检索数据。将查询分割成15个线程,引擎将使用15个全表扫描,性能会更糟。


感谢您的快速回复!我对InfluxDB还比较新,基本上只是在尝试。这一切都很有道理。我有点惊讶,因为这似乎是一个非常常见的用例。标签索引是0.9.0版本中的新功能 - 我目前正在运行稳定的0.8.8版本。 “为了启用诸如标签和特定列值的快速查找之类的功能,我们将添加对列索引的支持。这是跟踪列索引的问题。” - Cary Li
软件目前处于开发的Alpha阶段,因此有很多功能尚未完善,也存在许多bug。 - valentin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接