在工業互聯(lian)網和(he)物(wu)聯(lian)網等領域(yu),數(shu)據集的(de)價(jia)值與(yu)其規(gui)模是成(cheng)正比的(de):應用程序和(he)算(suan)法可以使(shi)用的(de)數(shu)據越多,它們(men)的(de)輸出(chu)結(jie)果就越精確(que)。然而,由眾多設備產生的(de)海(hai)量數(shu)據需要(yao)處理,對于大型企業來(lai)說(shuo),存儲成(cheng)本可能會非常高昂。
但有一個好消息,那就是時序數(shu)據(ju)非常易于壓縮(suo)。TDengine 大幅提高了數(shu)據(ju)壓縮(suo)率(lv),甚至能(neng)將(jiang)數(shu)據(ju)集(ji)壓縮(suo)至原始大小的1/10,并且幾乎(hu)不(bu)會影(ying)響處理性(xing)能(neng)。這(zhe)一切都得(de)益于幾個關鍵的創(chuang)新點。
列式存儲
時序數據庫主要用來存儲設備隨時間變化而產生的數據。這些數據通常以較短的時間間隔進行采集,比如一分鐘采集一次,或一秒鐘采集一次。這就導致每個數據點與其相鄰點的數值十分接近。以每(mei) 15s 測量一(yi)次溫(wen)度的(de)(de)設(she)備為(wei)例(li),在(zai)這(zhe)么(me)短(duan)的(de)(de)時(shi)間內,正常情況(kuang)下(xia),溫(wen)度的(de)(de)變(bian)化(hua)通(tong)常不(bu)會(hui)太大(da),保持在(zai)一(yi)個(ge)相對(dui)穩定的(de)(de)范圍內。
和 MySQL 這類采(cai)用行式(shi)存(cun)儲的通用數據庫不同,TDengine 采(cai)用列式(shi)存(cun)儲。
- 大幅提高壓縮率:同一列數據相近,便于壓縮;不同數據類型可采用不同壓縮算法。
- 大幅提高分析性能:時序數據的分析,往往是針對一個采集量在一個時間范圍段進行的。如果行式存儲,會讀取大量的無效數據。
采用(yong)列式(shi)存儲,由于這些數據的相似性,即便不使用(yong)復雜(za)的壓縮(suo)技(ji)術,也(ye)能達到很好的壓縮(suo)效(xiao)果。

兩級壓縮
TDengine 采用兩級壓縮(suo)(suo)技術,即先對數據進行編碼,然后在編碼的基礎上對數據塊進行壓縮(suo)(suo)。
TDengine 對數據(ju)的編(bian)碼方式如下:
- 較小的整數數據類型(INT、TINYINT 等)使用 simple8b 編碼。
- 較大的整數數據類型(BIGINT 和 UBIGINT)和時間戳使用 delta 編碼。
- 浮點數據類型(FLOAT 和 DOUBLE)使用 delta-of-delta 編碼。
delta 編(bian)碼,也稱增量編(bian)碼,是(shi)一種在序列(lie)數(shu)據(ju)(ju)(ju)之間以(yi)數(shu)據(ju)(ju)(ju)差(cha)異(delta)的(de)形式存儲或(huo)傳輸數(shu)據(ju)(ju)(ju)的(de)方法。例如,對于序列(lie)數(shu)據(ju)(ju)(ju) [2, 4, 6, 9, 7],delta 編(bian)碼會存儲 [2, 2, 2, 3, -2],其中每(mei)個值(zhi)表(biao)示(shi)前一個數(shu)據(ju)(ju)(ju)點(dian)(dian)與當(dang)前數(shu)據(ju)(ju)(ju)點(dian)(dian)之間的(de)差(cha)異。在時序數(shu)據(ju)(ju)(ju)場景下,由于相鄰數(shu)據(ju)(ju)(ju)點(dian)(dian)的(de)差(cha)異通常較小,Delta編(bian)碼可(ke)以(yi)顯著減少數(shu)據(ju)(ju)(ju)的(de)冗余,從而顯著提(ti)高壓縮效率(lv)。
編碼(ma)后(hou),對(dui)于所有的(de)(de)數據(ju)類(lei)(lei)型,會使(shi)(shi)用(yong)標(biao)準的(de)(de)數據(ju)壓縮(suo)算法(fa)進行(xing)壓縮(suo)。TDengine 默(mo)認對(dui)所有列使(shi)(shi)用(yong) lz4 進行(xing)壓縮(suo)。但用(yong)戶可以(yi)在(zai)建(jian)表時,根據(ju)需(xu)要配置(zhi) zlib、zstd、tsz、xz 或 disabled 等壓縮(suo)算法(fa),不同(tong)的(de)(de)數據(ju)類(lei)(lei)型,可以(yi)選擇不同(tong)的(de)(de)壓縮(suo)算法(fa)。詳(xiang)細(xi)可查看《》。
存儲壓(ya)縮(suo)算法增強后,TDengine 的(de)壓(ya)縮(suo)比(bi)預期可再提升一倍(bei)以上。
一個設備一張表
為充分利用其數據的時序性和其他數據特點,TDengine 采取一張設備一張表的策略(lve),要求對每(mei)個數(shu)據采(cai)(cai)集點(dian)(dian)單獨建表,用來存儲這個數(shu)據采(cai)(cai)集點(dian)(dian)所采(cai)(cai)集的時序數(shu)據。這樣的好(hao)處是:
- 每張表里的記錄按時間自動排序
- 新數據記錄的寫入變成簡單的追加操作
- 數值按列的變化范圍更小
- 設備 ID、標簽不會重復存儲
這樣的設計讓 TDengine 在數據壓縮率上遠超其他時序數據庫,同時,也便于數據(ju)的管理和查(cha)詢。
可配置壓縮算法
從 TDengine 3.3.0.0 版本開(kai)始,TDengine 提供(gong)了更高(gao)級的(de)壓(ya)縮(suo)(suo)(suo)功能,用戶可以在(zai)建表時針對每一列配置是否進行(xing)壓(ya)縮(suo)(suo)(suo)、以及使用的(de)壓(ya)縮(suo)(suo)(suo)算法和壓(ya)縮(suo)(suo)(suo)級別。
- 第一級壓縮支持多種編碼方法,可擴充, 包括 simple8b、delta-i、delta-d、bit-packing、disabled
- 第二級壓縮支持多種壓縮算法,可擴充,包括 lz4、zlib、zstd、tsz、xz、disabled
- 壓縮等級支持 高、中、低三種
詳見《》。
存(cun)儲壓縮(suo)算(suan)法增強(qiang)后,TDengine 的壓縮(suo)比預期可再(zai)提升一倍以(yi)上。


























