2015-04-24 34 views
5

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

指标通过以下方式写入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

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

+0

感谢您的快速响应!我对InfluxDB相当陌生,基本上只是试验。这一切都有道理。我有点惊讶,因为这似乎是一个非常常见的用例。 标签索引对于0.9.0版本来说是新鲜事物 - 目前我正在运行稳定的0.8.8。 “为了使标签和特定列值快速查找等事情,我们将添加对列索引的支持,以下是跟踪列索引的问题。” –

+0

该软件处于alpha版的开发状态,所以很多东西缺失和大量的错误 – valentin

4

正如@valentin答案所述,您需要为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的积分。