上一章聊到在車聯網或物聯網中對數據庫的需求,以及 IoTDB 的整體架構,詳情請見:
時序數據庫 Apache-IoTDB 源碼解析之系統架構(二)
打一波廣告,歡迎大家訪問IoTDB 倉庫,求一波 Star 。歡迎關注頭條號:列炮緩開局,歡迎關注 OSCHINA博客
這一章主要想聊一聊:
- 行式存儲、列式存儲的區別
- TsFile 的格式
行式與列式存儲的區別
假如我們的邏輯上的數據表格式及數據爲:
時間戳 | 人名 | 體溫 |
---|---|---|
1580950800 | 張三 | 36.5 |
1580950800 | 李四 | 36.9 |
1580950800 | 王五 | 36.7 |
那麼他出現在硬盤格式就是:
行式數據
在我理解上,行式數據是把邏輯相關的數據在硬盤上放到一起,比如上面的例子,我們可以稱之爲體溫表,所以在邏輯上:時間、人、體溫,就成爲了邏輯上緊密相關的數據。
所以把相關的數據的硬盤上的組織方式也變成連續的,假如我需要取 張三
的數據,那麼當你讀出 R1 文件塊的時候,就是讀出了所有 張三
相關的數據。
列式數據
列式數據在我理解是將物理相關的數據放到一起,比如時間是一類(long
類型)、名字是一類(string
類型)、體溫是一類(float
類型)。當然這種硬盤的組織方式,相比起行式數據庫,在取拼回體溫表的結構的時候,速度就慢了很多,因爲你要分別取 C1、C2、C3 文件塊,然後還要寫個容器往裏 Set()
。那麼列式數據存儲方式相比於行式存儲優勢在哪裏呢?
1.1 取數據方式
有一種叫法是只讀投影列,避免查詢無關列的讀取。列式存儲的優勢在於查詢的列數遠小於總屬性數量,就能少讀很多數據。可能讀起來非常繞口,舉個例子:比如我需要查體溫大於 36 度的體溫值,sql : select 體溫 FROM table WHERE 體溫 > 36
。這時候如果是列式存儲只需要讀出 C3 數據塊就可以一次性查到所有數據。而行式數據庫中,則需要讀出 R1、 R2、 R3。在第二章中介紹到物聯網中的時序數據的特點:存量數據非常大,如果遍歷幾百億數據,時間差距明顯就拉開了。
1.2 數據編碼和壓縮
因爲物理相關的數據他們類型相同,可以使用多種多樣的編碼方式,比如 IoTDB 中就提供了 8 種編碼方式,這個不具體聊,等後面章節再說。
我們繼續拿時間列舉例子,我們可以把時間列改造爲差值存儲: 比如 C1 文件塊中先存儲基礎值 1580950800 那麼他後面的數據值只需要存儲 0 就可以,存儲的數字小了,那麼佔用的存儲空間肯定也就小了,當數字特別大且差值比較小的時候,這用編碼方式就非常有意義。當然還有很多好玩兒的編碼方式,歡迎持續關注。
TsFile 文件格式
爲什麼叫 TsFile ?我聽意思應該是作爲 TimeSeriresFile 的縮寫,也就是時序數據文件的意思。
這是一個數據被刷入磁盤後的縮減版 TsFile 格式,我們還拿上面的數據舉例,用來直觀的解釋 TsFile 中出現的一些名詞,假如我的數據爲:
時間戳 | 人名 | 體溫 | 心率 |
---|---|---|---|
1580950800 | 張三 | 36.5 | 70 |
1580950800 | 李四 | 36.9 | 80 |
1580950800 | 王五 | 36.7 | 100 |
1580950911 | 王五 | 36.6 | 90 |
上面的數據刷新到磁盤上後會對應關係如下:
看到這裏應該能理解每個英文名詞的意思:
- ChunkGroup 代表了設備(邏輯概念上的一個集合),在 IoTDB 中稱爲 Device。
- Chunk 代表了測點數據(邏輯概念上的某一類數據的集合,如體溫數據),在 IoTDB 中稱爲 Measurement。
- Page 中存儲的是具體數據,包含一個時間序列、一個值序列。
- PageStatistics 是保存的是Page當中數據的預聚合信息。
- ChunkStatistics 是保存的是Chunk當中數據的預聚合信息。
ChunkGroup 中包含多個 Chunk,Chunk 中包含多個 Page ,Page 中 包含多個 時間點和數據項
回想上面提到的 SQL : select 體溫 FROM 王五 WHERE 體溫 > 36
, 在 TsFile 中,只要在文件中找到 王五
的 ChunkGroup ,並在 ChunkGroup 中找到 體溫
的 Chunk,然後從第一個 Page 開始遍歷就完成了。
介紹完了 Chunk 和 ChunkGroup 的概念,那麼如果 Chunk 和 ChunkGroup 非常多的時候,TsFile 怎麼來設計才能快速的定位並找到合適的 ChunkGroup 的呢?TsFile 怎樣才能做到損壞時的檢測或者保證傳遞過程的完整性呢?歡迎持續關注。。。
有興趣的朋友可以查看:官方 Github 中的 TsFile 文檔,瞭解更多詳細信息。