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 个并行调用会更快吗?

4

2 回答 2

4

正如@valentin 回答所说,您需要为 InfluxDB 的 id 列构建索引以有效地执行这些查询。

在 0.8 stable 中,您可以使用连续扇出查询来执行此“索引” 。例如,以下连续查询会将您的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-05-11T07:47:34.750 回答
2

在 id 列上建立索引。似乎他的引擎对表使用全扫描来检索数据。通过将查询拆分为 15 个线程,引擎将使用 15 次完整扫描,性能会差很多。

于 2015-04-24T22:11:04.687 回答