2015-04-24 61 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的積分。