摘要:為(wei)(wei)(wei)幫助用戶了(le)解TDengine Database的(de)指標,特將TDengine與InfluxDB從數(shu)據庫的(de)讀(du)、寫、查(cha)(cha)詢、壓縮比等方面進(jin)行了(le)對(dui)比測試(shi)(shi)。從測試(shi)(shi)結(jie)果上看,TDengine的(de)性(xing)能遠超InfluxDB,寫入性(xing)能約(yue)為(wei)(wei)(wei)5倍,讀(du)取性(xing)能約(yue)為(wei)(wei)(wei)35倍,聚(ju)合函(han)數(shu)性(xing)能約(yue)為(wei)(wei)(wei)140倍,按(an)標簽分組查(cha)(cha)詢性(xing)能約(yue)為(wei)(wei)(wei)250倍,按(an)時間分組查(cha)(cha)詢性(xing)能約(yue)為(wei)(wei)(wei)12倍。
測試環境
對比測(ce)試的(de)(de)測(ce)試程序和(he)數據(ju)庫(ku)服務在同(tong)一臺4核8GB的(de)(de)Dell臺式機上部署,臺式機型(xing)號為OptiPlex-3050,詳細配置如下(xia)
OS: Ubuntu 16.04 x64 CPU: Intel(R) Core(TM) i3-7100 CPU @ 3.90GHz Memory: 8GB Disk: 1TB HDD
測試數據集及其生成方法
1.測試數據生成方法
本(ben)次測(ce)試調研了兩類比較熱門的(de)測(ce)試數據(ju)集
- 紐約出租車運行數據,因該數據中抹去了單臺車輛的信息,無法對其進行建模
- faker生成工具,因其只能生成字符串,并不適合物聯網場景下處理的數據
所(suo)以(yi),為使測試可輕易重復,單獨編(bian)寫了一個生成模擬(ni)數據的程(cheng)序(xu)來進行本次(ci)測試。
測(ce)試數(shu)據(ju)生(sheng)(sheng)成程序模擬(ni)若(ruo)干溫濕(shi)度(du)計生(sheng)(sheng)成的(de)數(shu)據(ju),其中(zhong)溫度(du)為(wei)整數(shu)、濕(shi)度(du)為(wei)浮點數(shu),同時每個(ge)溫度(du)計包(bao)含設(she)備(bei)ID、設(she)備(bei)分組、設(she)備(bei)名稱三個(ge)標簽。為(wei)了盡可能真實地模擬(ni)溫濕(shi)度(du)計的(de)生(sheng)(sheng)成數(shu)據(ju),沒有使(shi)用完全隨機數(shu),而是針對每個(ge)溫度(du)計確(que)保生(sheng)(sheng)成的(de)數(shu)據(ju)值呈正態分布。
測試數(shu)(shu)據的頻(pin)率為(wei)1秒鐘,數(shu)(shu)據集(ji)包含10000臺設(she)備,每臺設(she)備10000條(tiao)記錄。每條(tiao)數(shu)(shu)據采集(ji)記錄包含1個(ge)(ge)時間戳(chuo)字(zi)(zi)段、2個(ge)(ge)數(shu)(shu)據字(zi)(zi)段和3個(ge)(ge)標簽字(zi)(zi)段。
2.測試數據生成程序源碼
采用java程序(xu)生(sheng)成測試數據集,測試程序(xu)源代碼(ma)可以到下(xia)(xia)載,下(xia)(xia)載后執行如下(xia)(xia)語句
cd tests/comparisonTest/dataGenerator javac com/taosdata/generator/DataGenerator.java
3.測試數據生成程序用法
相關參數如下
- dataDir 生成的數據文件路徑
- numOfFiles 生成的數據文件數目
- numOfDevices 測試數據集中的設備數目
- rowsPerDevice 測試數據集中每臺設備包含的記錄條數
4.生成測試數據
執行如下(xia)命令,會在~/testdata目錄下(xia)生成(cheng)100個數據文件(jian),每個文件(jian)包含(han)100臺設備的測試數據;合計10000臺設備,每臺設備10000條記(ji)錄
mkdir ~/testdata
java com/taosdata/generator/DataGenerator -dataDir ~/testdata -numOfDevices 10000 -numOfFiles 100 -rowsPerDevice 10000
TDengine環境準備
TDengine是一個開源的專為物聯網、車聯網、工業互聯網、IT運維等設計和優化的大數據平臺。除核心的快10倍以上的時序數據庫(Time-Series Database)功(gong)能(neng)(neng)外,還提供緩(huan)存、數據訂閱等(deng)功(gong)能(neng)(neng),最大程(cheng)度減少研發和運維的工作量。
1.安裝部署
- 下載tdengine-1.6.1.0.tar.gz,地址//yakult-sh.com.cn/
- 安裝TDengine,解壓后運行install.sh進行安裝
- 啟動TDengine,運行sudo systemctl start taosd
- 測試是否安裝成功,運行TDengine的shell命令行程序taos,可以看到如下類似信息
Welcome to the TDengine shell, server version:1.6.1.0 client version:1.6.1.0
Copyright (c) 2017 by TAOS Data, Inc. All rights reserved.
taos>
2.數據建模
TDengine為相(xiang)同結構(gou)的(de)設(she)(she)備(bei)創建(jian)一(yi)張超級表(biao),而每個具(ju)體的(de)設(she)(she)備(bei)則單獨創建(jian)一(yi)張數(shu)(shu)據表(biao)。因(yin)此,超級表(biao)的(de)數(shu)(shu)據字(zi)段為采集時(shi)間、溫度、濕度等(deng)與時(shi)間序列相(xiang)關(guan)的(de)采集數(shu)(shu)據;標(biao)簽字(zi)段為設(she)(she)備(bei)編(bian)號、設(she)(she)備(bei)分組編(bian)號、設(she)(she)備(bei)名稱等(deng)設(she)(she)備(bei)本身(shen)固定的(de)描述(shu)信(xin)息。
創建(jian)超級表(biao)的(de)SQL語句為
create table devices(ts timestamp, temperature int, humidity float) tags(devid int, devname binary(16), devgroup int);
以設備ID作為(wei)表(biao)(biao)(biao)名(例如device id為(wei)1,則(ze)表(biao)(biao)(biao)名為(wei)dev1),使用自動建表(biao)(biao)(biao)語(yu)句(ju),寫(xie)入一條記錄(lu)的語(yu)句(ju)為(wei)
insert into dev1 using devices tags(1,'d1',0) values(1545038786000,1,3.560000);
3.測試程序源碼
本文采用TDengine的(de)(de)原生(sheng)C語言接口,編寫數據寫入及查(cha)詢(xun)程序(xu),后續的(de)(de)其他文章會提供基(ji)于(yu)JDBCDriver的(de)(de)測試程序(xu)。
測(ce)試程序源代碼及查詢SQL語(yu)句(ju)可以到(dao)下載,下載后執(zhi)行如下語(yu)句(ju)
cd tdengine
make
會在當前目錄(lu)下生成可執(zhi)行文件./tdengineTest
4.測試程序用法
TDengine的測試程序用(yong)法與InfluxDB的用(yong)法相同,寫入相關參(can)數(shu)
- writeClients 并發寫入的客戶端鏈接數目,默認為1
- rowsPerRequest 一次請求中的記錄條數,默認為100,范圍1-1000
- dataDir 讀取的數據文件路徑,來自于測試數據生成程序
- numOfFiles 從數據文件路徑中讀取的文件個數
例如
./tdengineTest -dataDir ./data -numOfFiles 10 -writeClients 2 -rowsPerRequest 100
查詢相關參數
- sql 將要執行的SQL語句列表所在的文件路徑,以逗號區分每個SQL語句
例如
./tdengineTest -sql ./sqlCmd.txt
InfluxDB環境準備
InfluxDB是一(yi)款開(kai)源的時序數(shu)據(ju)(ju)庫,由Go語(yu)言實(shi)現。適用(yong)于監控、實(shi)時分析、物(wu)聯網(wang)、傳感器數(shu)據(ju)(ju)等應(ying)用(yong)場景(jing),是目前最(zui)為(wei)流行的時間序列數(shu)據(ju)(ju)庫。
1.安裝部署
- 下載并安裝InfluxDB
wget //dl.influxdata.com/influxdb/releases/influxdb_1.7.7_amd64.deb
sudo dpkg -i influxdb_1.7.7_amd64.deb
- 啟動InfluxDB服務
sudo systemctl start influxdb
- 測試是否安裝成功,運行InfluxDB的shell命令行程序influx,可以看到如下類似信息
Connected to //localhost:8086 version 1.7.7
InfluxDB shell version: 1.7.7
>
2.InfluxDB數據建模
創建(jian)一個(ge)名為(wei)devices的measurement,所有設備(bei)都屬于該(gai)measurement,不同設備(bei)通過標簽(qian)進(jin)行(xing)區分(fen)。每臺設備(bei)包含三個(ge)標簽(qian),分(fen)別為(wei)設備(bei)編(bian)號(hao)、設備(bei)分(fen)組編(bian)號(hao)、設備(bei)名稱(cheng)。每條記(ji)錄包含三個(ge)數據(ju)字段(duan),分(fen)別為(wei)時間戳(毫秒(miao)),溫度(整(zheng)型),濕(shi)度(浮點)。
3.InfluxDB測試程序源碼
本文采(cai)用(yong)InfluxDB的原生(sheng)GO語(yu)(yu)言接口,編寫數據寫入及查詢程序(xu),測試(shi)程序(xu)源代碼及查詢SQL語(yu)(yu)句可以到(dao)下載。下載后需(xu)要先安裝GO語(yu)(yu)言環境(jing)。
sudo apt install golang
mkdir -p $HOME/local/Golang
export GOPATH=$HOME/local/Golang
go get github.com/influxdata/influxdb1-client/v2
然后執行如下語句
cd tests/comparisonTest/influxdb
go build -o influxdbTest
會在當前目錄下生成可執行(xing)文件(jian)./influxdbTest
4.InfluxDB測試程序用法
寫入相關參數
- writeClients 并發寫入的客戶端鏈接數目,默認為1
- rowsPerRequest 一次請求中的記錄條數,默認為100,范圍1-1000
- dataDir 讀取的數據文件路徑,來自于測試數據生成程序
- numOfFiles 從數據文件路徑中讀取的文件個數
例如
./influxdbTest -dataDir ~/testdata -numOfFiles 1 -writeClients 2 -rowsPerRequest 100
查詢相關參數
- sql 將要執行的SQL語句列表所在的文件路徑,以逗號區分每個SQL語句
例如
./influxdbTest -sql ./sqlCmd.txt
寫入性能對比
數(shu)(shu)據庫(ku)(ku)的一(yi)(yi)個(ge)寫(xie)入請求(qiu)可(ke)以(yi)包含一(yi)(yi)條(tiao)或多條(tiao)記錄(lu)(lu),一(yi)(yi)次(ci)請求(qiu)里包含的記錄(lu)(lu)條(tiao)數(shu)(shu)越多,寫(xie)入性能就會相(xiang)應(ying)提升。在以(yi)下測試中,使用R/R表示Records/Request ,即一(yi)(yi)次(ci)請求(qiu)中的記錄(lu)(lu)條(tiao)數(shu)(shu)。同時,一(yi)(yi)個(ge)數(shu)(shu)據庫(ku)(ku)可(ke)以(yi)支持多個(ge)客(ke)戶(hu)(hu)端連接,連接數(shu)(shu)增(zeng)加,系統總(zong)的寫(xie)入通吐(tu)量也會相(xiang)應(ying)增(zeng)加。因此(ci)測試中,對于每(mei)一(yi)(yi)個(ge)數(shu)(shu)據庫(ku)(ku),都會測試一(yi)(yi)個(ge)客(ke)戶(hu)(hu)端和(he)多個(ge)客(ke)戶(hu)(hu)端連接的情(qing)況。
1.TDengine的寫入性能
TDengine按照每次請求包含1,100,500,1000,2000條記錄各進行(xing)測(ce)試,同時(shi)也測(ce)試了不同客戶(hu)端連(lian)接數的情(qing)況(kuang)。測(ce)試步驟(zou)如下所示,您(nin)可以修改(gai)示例(li)中(zhong)的參數,完成多次不同的測(ce)試。
1.清空上次測試數據
運行TDengine的shell命令行程序taos,執行刪除測試數據庫語句
Welcome to the TDengine shell, server version:1.6.1.0 client version:1.6.1.0
Copyright (c) 2017 by TAOS Data, Inc. All rights reserved.
taos>drop database db;
2.測試執行
開啟5個客戶端讀取~/testdata目錄中的100個數據文件,每個請求寫入1000條數據,可以參考如下命令
./tdengineTest -dataDir ~/testdata -numOfFiles 100 -writeClients 5 -rowsPerRequest 1000
寫入吞吐量(liang)如(ru)下(xia),單位為記錄數/秒
| R/R | 1 client | 2 clients | 3 clients | 4 clients | 5 clients | 6 clients | 7 clients |
|---|---|---|---|---|---|---|---|
| 1 | 26824 | 43699 | 55137 | 62869 | 64529 | 68647 | 72277 |
| 100 | 415800 | 734484 | 895522 | 976085 | 1087902 | 1171074 | 1192199 |
| 500 | 479846 | 882612 | 1083032 | 1195100 | 1269196 | 1364256 | 1417004 |
| 1000 | 500751 | 914494 | 1121914 | 1239157 | 1367989 | 1418104 | 1476560 |
| 2000 | 512820 | 1055520 | 1174164 | 1306904 | 1426635 | 1458434 | 1477208 |

2.InfluxDB的寫入性能
InfluxDB按照每(mei)次(ci)請求包(bao)含1,100,1000,10000,20000,50000,100000條記錄各進行測(ce)試(shi)(shi),同時也測(ce)試(shi)(shi)了不同客(ke)戶端連接數的(de)情況。測(ce)試(shi)(shi)步(bu)驟如下所示(shi)(shi),您可以修(xiu)改示(shi)(shi)例中的(de)參數,完(wan)成多次(ci)不同的(de)測(ce)試(shi)(shi)。
1.清空上次測試數據
運行InfluxDB的shell命令行程序influx,可以看到如下類似信息
Connected to //localhost:8086 version 1.7.7
InfluxDB shell version: 1.7.7
> drop database db;
2.測試執行
開啟5個客戶端讀取~/testdata目錄中的100個數據文件,每個請求寫入10000條數據,可以參考如下命令
./influxdbTest -dataDir ~/testdata -numOfFiles 100 -writeClients 5 -rowsPerRequest 10000
寫入吞吐量如下,單(dan)位為記錄(lu)數(shu)/秒
| R/R | 1 client | 2 clients | 3 clients | 4 clients | 5 clients | 6 clients | 7 clients |
|---|---|---|---|---|---|---|---|
| 1 | 31 | 43 | 55 | 67 | 80 | 92 | 106 |
| 100 | 3024 | 4325 | 5709 | 6819 | 8013 | 9204 | 10173 |
| 1000 | 21940 | 30659 | 40825 | 50622 | 60567 | 70311 | 77174 |
| 10000 | 88686 | 155154 | 209377 | 234124 | 245141 | 257454 | 261542 |
| 20000 | 96277 | 179492 | 234413 | 255805 | 263160 | 268466 | 271249 |
| 50000 | 125187 | 200552 | 243861 | 264780 | 271101 | 270364 | 273820 |
| 100000 | 130108 | 197202 | 240059 | 254973 | 265922 | 272275 | 270859 |

3.TDengin和InfluxDB的最佳性能對比
基(ji)于(yu)以上(shang)的測試數據(ju),將TDengine和InfluxDB測試出的最佳寫入(ru)速(su)度進行對比,結果(guo)如下(xia)
| R/R | 1 client | 2 clients | 3 clients | 4 clients | 5 clients | 6 clients | 7 clients |
|---|---|---|---|---|---|---|---|
| TDengine | 512820 | 1055520 | 1174164 | 1306904 | 1426635 | 1458434 | 1477208 |
| InfluxDB | 130108 | 200552 | 243861 | 264780 | 271101 | 272275 | 273820 |

從(cong)圖3可以看(kan)出,TDengine的(de)寫入(ru)速(su)(su)度(du)約(yue)為(wei)百萬條記錄(lu)/秒的(de)量(liang)級,而InfluxDB的(de)寫入(ru)速(su)(su)度(du)約(yue)為(wei)十萬條記錄(lu)/秒的(de)量(liang)級。因此(ci)可以得(de)出結論,在(zai)同等數據集和硬件(jian)環境下,TDengine的(de)寫入(ru)速(su)(su)度(du)遠高(gao)于InfluxDB,約(yue)為(wei)5倍。
需要指出(chu)的是(shi),InfluxDB的單條插入(ru)(ru)性能很低(di),因此必須(xu)采用Kafka或其(qi)他消(xiao)息隊列軟件(jian),成(cheng)批寫入(ru)(ru),這樣增加了系統開發和維護的復(fu)雜度與運營成(cheng)本。
讀取性能對比
本測試(shi)(shi)做了簡單的(de)遍歷查(cha)詢,就是將(jiang)寫入的(de)數(shu)據全(quan)部讀出。因為InfluxDB的(de)GO客戶端在解析(xi)JSON返回結果(guo)時(shi)的(de)限(xian)制,故每次查(cha)詢僅取出100萬條記(ji)錄。在測試(shi)(shi)數(shu)據準備時(shi),已經按照devgroup標(biao)簽將(jiang)設備拆(chai)分成100個(ge)分組(zu),本次測試(shi)(shi)隨機(ji)選取其中10個(ge)分組(zu)進行查(cha)詢。
1.TDengine的測(ce)試方法(fa)
測試SQL語句存儲在tdengine/q1.txt中,測試SQL語句參考
select * from db.devices where devgroup=0;
執行方法如下
./tdengineTest -sql ./q1.txt
2.InfluxDB的測試方法
測試SQL語句存儲在influxdb/q1.txt中,測試SQL語句參考
select * from devices where devgroup='0';
執行方法如下
./influxDBTest -sql ./q1.txt
如下(xia)所示,橫軸為(wei)設(she)備分組編號,測(ce)試結果(guo)的單位為(wei)秒
| 分組0 | 分組10 | 分組20 | 分組30 | 分組40 | 分組50 | 分組60 | 分組70 | 分組80 | 分組90 | |
|---|---|---|---|---|---|---|---|---|---|---|
| TDengine | 0.235 | 0.212 | 0.208 | 0.218 | 0.209 | 0.210 | 0.209 | 0.209 | 0.216 | 0.208 |
| InfluxDB | 7.56 | 7.21 | 7.64 | 7.28 | 7.64 | 7.52 | 7.52 | 7.52 | 7.32 | 7.42 |

從(cong)圖4中(zhong)可(ke)以看(kan)(kan)出,TDengine的100萬(wan)條(tiao)的讀取(qu)速度(du)穩(wen)定在0.21秒,吞吐量(liang)(liang)約(yue)為500萬(wan)條(tiao)記錄/秒,InfluxDB的100萬(wan)條(tiao)的讀取(qu)速度(du)穩(wen)定在7.5秒,吞吐量(liang)(liang)約(yue)為13萬(wan)條(tiao)記錄/秒。所以從(cong)測試結果來看(kan)(kan),TDengine的查詢吞吐量(liang)(liang)遠(yuan)高(gao)于InfluxDB。
聚合函數性能對比
本單元的測試包含COUNT,AVERAGE,SUM,MAX,MIN,SPREAD這六個TDEngine和InfluxDB共(gong)有的聚合函(han)(han)數。所有測試函(han)(han)數都會搭配篩(shai)選條件(WHERE)來選取設備(bei)的十分之(zhi)一、十分之(zhi)二、十分之(zhi)三(san)、直到全部(bu)設備(bei)。
1.TDengine的聚合函數性能
測(ce)試(shi)SQL語句(ju)存儲在tdengine/q2.txt中,測(ce)試(shi)SQL語句(ju)參考(kao)
select count(*) from db.devices where devgroup<10;
執行方法如下
./tdengineTest -sql ./q2.txt
如下所示,橫(heng)軸為查詢設(she)備占(zhan)總設(she)備的百分(fen)比,測試結果的單位為秒
| 10% | 20% | 30% | 40% | 50% | 60% | 70% | 80% | 90% | 100% | |
|---|---|---|---|---|---|---|---|---|---|---|
| count | 0.018 | 0.026 | 0.016 | 0.018 | 0.017 | 0.024 | 0.024 | 0.027 | 0.030 | 0.033 |
| avg | 0.007 | 0.014 | 0.015 | 0.020 | 0.024 | 0.038 | 0.044 | 0.050 | 0.057 | 0.060 |
| sum | 0.006 | 0.010 | 0.019 | 0.018 | 0.031 | 0.036 | 0.034 | 0.037 | 0.043 | 0.046 |
| max | 0.007 | 0.013 | 0.015 | 0.020 | 0.025 | 0.030 | 0.035 | 0.039 | 0.045 | 0.049 |
| min | 0.006 | 0.010 | 0.016 | 0.024 | 0.032 | 0.039 | 0.045 | 0.041 | 0.043 | 0.049 |
| spread | 0.007 | 0.010 | 0.015 | 0.019 | 0.033 | 0.038 | 0.046 | 0.052 | 0.059 | 0.066 |

2.InfluxDb的聚合函數性能
測試(shi)SQL語(yu)句存儲(chu)在influxdb/q2.txt中(zhong)。因為(wei)InfluxDB的(de)標簽(qian)僅能為(wei)字符串,所以測試(shi)SQL語(yu)句的(de)篩選條(tiao)件為(wei)正則表達式(shi),如下的(de)SQL語(yu)句選取第10-19個(ge)group中(zhong)的(de)數(shu)據,例如
select count(*) from devices where devgroup=~/[1-1][0-9]/;
執行方法如下
./influxdbTest -sql ./q2.txt
如下所示,橫軸為(wei)查詢(xun)設(she)備占總(zong)設(she)備的百(bai)分比,測試結果的單位為(wei)秒
| 10% | 20% | 30% | 40% | 50% | 60% | 70% | 80% | 90% | 100% | |
|---|---|---|---|---|---|---|---|---|---|---|
| count | 1.06 | 2.14 | 3.28 | 4.15 | 5.26 | 6.19 | 7.01 | 8.09 | 9.06 | 9.92 |
| mean | 0.99 | 2.05 | 2.77 | 3.68 | 4.51 | 5.35 | 6.14 | 6.95 | 7.70 | 8.44 |
| sum | 1.02 | 2.04 | 2.89 | 3.75 | 4.64 | 5.50 | 6.38 | 7.18 | 7.94 | 8.72 |
| max | 1.01 | 1.99 | 2.85 | 3.77 | 4.69 | 5.52 | 6.35 | 7.17 | 7.95 | 8.80 |
| min | 1.03 | 2.02 | 2.95 | 3.81 | 4.64 | 5.48 | 6.33 | 7.18 | 8.01 | 8.72 |
| spread | 7.38 | 16.92 | 27.44 | 38.25 | 49.86 | 60.68 | 71.61 | 82.50 | 94.68 | 105.26 |

3.聚合函數性能對比
基于以上的測試(shi)數據,將TDengine和InfluxDB在1億(yi)條記錄數據集的測試(shi)結(jie)果(guo)進行對比
| count | average | sum | max | min | spread | |
|---|---|---|---|---|---|---|
| TDengine | 0.033 | 0.06 | 0.046 | 0.049 | 0.049 | 0.066 |
| InfluxDB | 9.92 | 8.44 | 8.72 | 8.8 | 8.72 | 105.26 |

從圖(tu)7可以(yi)看出,TDengine的聚(ju)合函(han)數查詢時間(jian)在100毫秒以(yi)內,而(er)InfluxDb的查詢時間(jian)在10秒左右。因此(ci)可以(yi)得出結論,在同等(deng)數據集和硬(ying)件環境下(xia),TDengine聚(ju)合函(han)數的查詢速度遠(yuan)遠(yuan)高于InfluxDB,超過100倍。
按標簽分組查詢性能對比
本測試(shi)做了按標簽(qian)分(fen)組函數(shu)的性(xing)能測試(shi),測試(shi)函數(shu)會搭配篩選(xuan)條(tiao)件(WHERE)來選(xuan)取設備的十分(fen)之一(yi)、十分(fen)之二、十分(fen)之三、直(zhi)到(dao)全部(bu)設備。
1.TDengine的(de)測試方法(fa)
測試SQL語句存儲在tdengine/q3.txt中,例如(ru)
select count(temperature), sum(temperature), avg(temperature) from db.devices where devgroup<10 group by devgroup;
執行方法如下
./tdengineTest -sql ./q3.txt
2.InfluxDB的測試方(fang)法
測試SQL語(yu)句存儲(chu)在(zai)influxdb/q3.txt中,例如
select count(temperature), sum(temperature), mean(temperature) from devices where devgroup=~/[1-1][0-9]/ group by devgroup;
執行方法如下
./influxdbTest -sql ./q3.txt
如(ru)下所示,橫軸(zhou)為(wei)查詢設備占總設備的(de)百分比,測試結果的(de)單位(wei)為(wei)秒(miao)
| 10% | 20% | 30% | 40% | 50% | 60% | 70% | 80% | 90% | 100% | |
|---|---|---|---|---|---|---|---|---|---|---|
| TDengine | 0.030 | 0.028 | 0.031 | 0.041 | 0.069 | 0.066 | 0.077 | 0.091 | 0.102 | 0.123 |
| InfluxDB | 3.19 | 6.37 | 9.60 | 12.95 | 15.93 | 19.16 | 22.05 | 25.20 | 28.06 | 31.52 |

從測試結果來看,TDengine的分組聚合(he)查詢速(su)度遠高于InfluxDB,約為300倍(bei)。
按時間分組查詢性能對比
本測(ce)(ce)試(shi)(shi)做了按時間分(fen)(fen)組函數的(de)性能測(ce)(ce)試(shi)(shi),測(ce)(ce)試(shi)(shi)函數會搭配篩選(xuan)條件(WHERE)來(lai)選(xuan)取設(she)備(bei)的(de)十(shi)分(fen)(fen)之(zhi)(zhi)一、十(shi)分(fen)(fen)之(zhi)(zhi)二、十(shi)分(fen)(fen)之(zhi)(zhi)三、直(zhi)到全(quan)部設(she)備(bei)。
1.TDengine的測試方法
測(ce)試SQL語(yu)句存儲在tdengine/q4.txt中,例(li)如
select count(temperature), sum(temperature), avg(temperature) from db.devices where devgroup<10 interval(1m);
執行方法如下
./tdengineTest -sql ./q4.txt
2.InfluxDB的測試方法
測試(shi)SQL語句存儲在influxdb/q4.txt中,例如
select count(temperature), sum(temperature), mean(temperature) from devices where devgroup=~/[1-1][0-9]/ group by time(1m);
執行方法如下
./influxdbTest -sql ./q4.txt
如(ru)下所示,橫軸(zhou)為查詢設備占總(zong)設備的(de)百分比,測(ce)試結果(guo)的(de)單(dan)位為秒
| 10% | 20% | 30% | 40% | 50% | 60% | 70% | 80% | 90% | 100% | |
|---|---|---|---|---|---|---|---|---|---|---|
| TDengine | 0.237 | 0.472 | 0.653 | 0.902 | 1.134 | 1.422 | 1.753 | 1.784 | 2.085 | 2.549 |
| InfluxDB | 3.26 | 6.50 | 9.59 | 12.85 | 16.07 | 19.02 | 22.32 | 25.44 | 28.29 | 31.44 |

從測試結果來看,TDengine的(de)分(fen)組聚合查詢速度(du)遠高于InfluxDB,約為(wei)12倍。
壓縮比對比
1.原始數據的磁盤占用
本次測試共生成100個(ge)測試數據文件,存儲在~/testdata目(mu)錄下,使用du命令查看~/testdata目(mu)錄的文件大小(xiao)
cd ~/testdata
du -m .
如下圖所示

2.查看TDengine的磁盤占用
TDengine的磁盤(pan)文件(jian)默認(ren)位(wei)置在目錄(lu)/var/lib/taos/data下,在查看磁盤(pan)文件(jian)大小時(shi),首先將TDengine的服(fu)務停止(zhi)
sudo systemctl stop taosd
然后,調用du命令(ling),查看/var/lib/taos/data目(mu)錄(lu)下文件的大小
cd /var/lib/taos/data
du -h .

3.查看InfluxDB的磁盤占用
InfluxDB的磁盤文(wen)件默認位置在目錄/var/lib/influxdb/data/db下,在查看磁盤文(wen)件大小時,首先將InfluxDB的服(fu)務(wu)停止
sudo systemctl stop influxDb
目(mu)錄(lu)/var/lib/taos/data為(wei)用戶influxdb所(suo)有,請確保當前用戶有查(cha)看(kan)該目(mu)錄(lu)的(de)權(quan)限。本(ben)測試中,數(shu)據存儲(chu)在autogen/84目(mu)錄(lu)下,調用du命令,查(cha)看(kan)該目(mu)錄(lu)下文件的(de)大小(xiao)。
cd /var/lib/influxdb/data/db/autogen/84
du -h .

4.磁盤占用情況對比
生成的(de)測(ce)試數據文件(jian)占(zhan)(zhan)用的(de)磁盤(pan)大小為3941MB,InfluxDB磁盤(pan)占(zhan)(zhan)用855MB,TDengine磁盤(pan)占(zhan)(zhan)用459MB。在相對比(bi)較隨(sui)機數據集的(de)情況(kuang)下,TDengine的(de)壓(ya)縮比(bi)約為InfluxDB壓(ya)縮比(bi)的(de)1.86倍(bei)。
在(zai)物(wu)聯網場景下,大(da)多數(shu)采(cai)集數(shu)據的(de)變化范圍都比(bi)較小。由于TDengine采(cai)用列式存儲(chu),因此可(ke)以預期,TDengine在(zai)真實(shi)場景的(de)壓(ya)縮比(bi)表現(xian)會更好。
功能對比
TDengine與InfluxDB都(dou)能(neng)用(yong)(yong)于時序數據的處理(li),兩者(zhe)在數據庫層面上(shang)功能(neng)接近。但TDengine還具備消息(xi)隊列、緩存、消息(xi)訂閱等大(da)數據平臺所需要的功能(neng)。使用(yong)(yong)InfluxDB,還需要集成Kafka, Redis或其他類(lei)似軟件。具體對比如下:
| 功能支持 | TDengine | InfluxDB |
|---|---|---|
| SQL語法支持 | 支持 | 支持 |
| Schema | 需要定義 | 無需定義 |
| 私有化部署支持 | 支持 | 支持 |
| 水平擴展能力 | 支持 | 支持 |
| 系統連接管理 | 支持 | 支持 |
| 查詢任務管理 | 支持 | 支持 |
| 數據導入工具 | 支持 | 支持 |
| 數據導出工具 | 支持 | 支持 |
| Web管理工具 | 支持 | 支持 |
| 多介質分級存儲 | 支持 | 支持 |
| Telegraf數據采集 | 支持 | 支持 |
| Grafana數據可視化 | 支持 | 支持 |
| RESTFul | 支持 | 支持 |
| C/C++ | 支持 | 不支持 |
| JDBC/ODBC | 支持 | 不支持 |
| GO | 支持 | 支持 |
| Python | 支持 | 支持 |
| 數據庫參數配置 | 支持 | 支持 |
| 配置副本數 | 支持 | 支持 |
| 數據時效 | 支持 | 支持 |
| 數據分區 | 支持 | 支持 |
| 連續查詢 | 支持 | 支持 |
| 數據訂閱 | 支持 | 不支持 |
| 緩存 | 支持 | 不支持 |
| 微秒級精度 | 支持 | 支持 |
| 聚合函數支持 | 支持 | 支持 |
| 數據降采樣 | 支持 | 支持 |
| 數據分頁 | 支持 | 支持 |
| 數據插值 | 支持 | 支持 |
| 歷史數據修改 | 不支持 | 支持 |
| 歷史數據的標簽修改 | 支持 | 不支持 |
| 時間線刪除 | 支持 | 支持 |
| 數據清空 | 支持 | 支持 |
| Matlab 接口 | 支持 | 無官方支持 |
| R 接口 | 支持 | 無 |
| 安裝包大小 | 1.5M | 48M |
總結
此次測試,從數(shu)據庫的讀、寫、查詢、壓縮(suo)比等方面對TDengine和InfluxDB進行(xing)了對比測試。測試用(yong)數(shu)據集、測試程序(xu)源碼(ma)、執行(xing)的SQL語句都可(ke)以從下載,測試具備(bei)可(ke)重(zhong)復性(xing)。
從測試(shi)結果上看,TDengine的性(xing)能(neng)遠超InfluxDB,寫入性(xing)能(neng)約為(wei)5倍(bei),讀取性(xing)能(neng)約為(wei)35倍(bei),聚合函數性(xing)能(neng)約為(wei)140倍(bei),按標(biao)簽(qian)分(fen)(fen)組(zu)查詢(xun)性(xing)能(neng)約為(wei)250倍(bei),按時(shi)間分(fen)(fen)組(zu)查詢(xun)性(xing)能(neng)約為(wei)12倍(bei),壓縮比約為(wei)1.8倍(bei),具體(ti)見下(xia)表
| TDengine | InfluxDB | |
|---|---|---|
| 寫入吞吐量 | 1477208 記錄數/秒 | 273820 記錄數/秒 |
| 100萬條記錄讀取時間 | 0.21秒 | 7.5秒 |
| 1億條記錄取平均值時間 | 0.06秒 | 8.44秒 |
| 1億條記錄按標簽分組取均值時間 | 0.123秒 | 31.52秒 |
| 1億條記錄按時間分組取均值時間 | 2.549秒 | 31.44秒 |
| 1億條記錄的磁盤占用空間 | 459MB | 855MB |


























