如何設計時間線結構提升查詢效率
本文介紹通過設計時間線結構提升查詢效率。
時間線概念
在TSDB里,我們將一個指標+一組標簽組合稱為一條時間線。在一條時間線下面,連續時間點的采樣數據則為時序數據。比如:{“metric”:“cpu”,“tags”:{“site”:“et2”,“ip”:“1.1.1.1”,“app”: “TSDB”} }
這個metric+tags的組合為一條時間線,在同一條時間線下面產生連續的(timestamp,value)。例如,下圖有3條時間線:
時間線倒排索引概念
為了加速查詢,TSDB會給每一條時間線都生成倒排索引。具體來說,TSDB會給時間線上的每個tag、metric生成索引,索引到該tag、metric對應到的時間線上。例如,在時間線概念里出現的3條時間線,會生成如下所示的倒排索引:
最佳實踐
減少時間線數量
在TSDB中,唯一決定時間線的有如下因素:
metric相同。
tags數量相同。
每一個tag的TagKey和TagValue都相同。
說明在設計時間線的tag的TagValue時,不建議將進程ID或時間戳設置為TagValue,需要讓同一tag的Value值變化盡可能少。TagValue如果設計得有誤,即便metric,TagKey都沒有顯著變化時,時間線數量也有可能飛速膨脹。
字段名 (僅在使用多值模型時)。
線數量的上限等于metric和tag的集合的笛卡爾積(若是多值模型時,還需要加上field的集合)。因此,建議用戶在設計時間線時,盡量減少metric或者tag的變化,以免時間線不斷膨脹,超過規格限制。
減少單個Tag 標簽索引時間線量
避免在每一條時間線上都設置一個相同的標簽,以免該標簽索引的時間線數量過多,影響查詢時的性能。
減少查詢時間線覆蓋
如果標簽1索引的時間線的集合是標簽2的子集,那么查詢時可以只使用標簽1,以提升查詢性能。例如,在上面的例子中,若我們想查詢時間線1的數據,有如下兩種查詢方式:
方式一:
{“metric”:“cpu”,”tags”:{“site”:“et2”,“ip”:“1.1.1.1”,“app”:“TSDB”} }
方式二:
{“metric”:“cpu”,”tags”:{“ip”:“1.1.1.1”} }
查詢方式二只使用了1個標簽,因為
ip=1.1.1.1
這個標簽只索引了1條時間線。因此,相比查詢方式一,查詢方式二的性能反而是更好的。