六月婷婷AV,国产偷窥猎奇福利二区,日韩三级片。,好吊色网站,日韩成人中文在线视频,国产亚洲午夜啪啪,亚洲欧美另类国产精品,国产成人av1,任你艹在线观看

數(shù)據(jù)模型對比之 InfluxDB vs TDengine

數(shù)據(jù)模型對比之 InfluxDB vs TDengine

在學習關(guān)系數(shù)據(jù)庫的時候,很多教材都會提供一些經(jīng)典的例子,比如如何為學生建表,管理他們學習的科目、成績、綜合表現(xiàn)等,先從邏輯上分解定義庫、表,同時通過主鍵外鍵構(gòu)建起表與表之間的關(guān)系,然后轉(zhuǎn)換成具體的 SQL 語句,最后通過各類關(guān)系運算實現(xiàn)數(shù)據(jù)的增刪改查。

但是在使用時序數(shù)據(jù)庫(Time Series Database,TSDB)的時候,我們首先要面對的一個問題就是如何建立數(shù)據(jù)模型(Data Model),也就是如何將業(yè)務(wù)邏輯中的實體數(shù)據(jù)具體映射到所選的時序庫。

而且出于對讀寫性能、壓縮效率等目標的權(quán)衡,不同的時序數(shù)據(jù)庫產(chǎn)品有可能會選擇不同的模型,這時候就要仔細分析了。本文將以 InfluxDB 和 TDengine 為例,對比學習一下它們的數(shù)據(jù)模型。

概述

InfluxDB 針對現(xiàn)實世界的測量值選擇了 bucket、measurement 這兩個核心概念,沒有關(guān)系數(shù)據(jù)庫里的 database、table 等概念;而 TDengine 選擇了兼容 SQL、降低門檻的路線,也就繼承了 database、table 等概念,同時創(chuàng)新性地提出了“一個數(shù)據(jù)采集點一張表”的數(shù)據(jù)模型。

InfluxDB 的數(shù)據(jù)模型

我們先來看看 InfluxDB 中的核心概念。根據(jù)其官方文檔:

InfluxDB 數(shù)據(jù)模型將時序數(shù)據(jù)組織為 bucket 和 measurement。一個 bucket 可以包含多個 measurement。measurement 可以包含多個標簽和字段。

可以將 bucket 理解為存儲時序數(shù)據(jù)的位置,我們可以為其指定時序數(shù)據(jù)的保存策略。measurement 則用于時序數(shù)據(jù)的邏輯分組。從邏輯意義上對比,我們可以把 bucket 看作關(guān)系數(shù)據(jù)庫中的 database,把 measurement 看作 table。

measurement 又包括幾個部分:

  • 標簽(tag):其值不經(jīng)常改變的鍵值對。用來保存一些相對靜態(tài)的信息,比如采集設(shè)備的主機、位置、站點等。
  • 字段(field):其值隨著時間經(jīng)常改變的鍵值對,比如溫度、壓強、股價等。
  • 時間戳(timestamp):與當前數(shù)據(jù)關(guān)聯(lián)的時間戳。

在此基礎(chǔ)上,InfluxDB 又有兩個新的概念,point(數(shù)據(jù)點)和時間線(series),當然這在很多時序數(shù)據(jù)庫中都是類似的。

整體來看,InfluxDB 的數(shù)據(jù)模型比較直觀,而且不需要提前定義好模式,容易上手,后期如果有需要,動態(tài)增加新的字段也比較容易。當然,考慮后續(xù)的查詢性能,在數(shù)據(jù)量非常大的情況下,也需要仔細設(shè)計 measurement 中的 tag 和 field,在此就不做贅述。新用戶可以直接使用 InfluxDB 的圖形界面或命令行客戶端來創(chuàng)建 bucket,然后就可以利用行協(xié)議寫入數(shù)據(jù)了。就像這樣:

influx write \
  --bucket get-started \
  --precision s "
home,room=Living\ Room temp=21.1,hum=35.9,co=0i 1641024000
home,room=Kitchen temp=21.0,hum=35.9,co=0i 1641024000
home,room=Living\ Room temp=21.4,hum=35.9,co=0i 1641027600
home,room=Kitchen temp=23.0,hum=36.2,co=0i 1641027600
home,room=Living\ Room temp=21.8,hum=36.0,co=0i 1641031200
home,room=Kitchen temp=22.7,hum=36.1,co=0i 1641031200
home,room=Living\ Room temp=22.2,hum=36.0,co=0i 1641034800
"

在查詢方面,InfluxDB 提供了類 SQL 的 InfluxQL 語言,后來又推出了函數(shù)式的腳本語言 Flux。需要一定的學習成本。

TDengine 的數(shù)據(jù)模型

TDengine 充分利用了時序數(shù)據(jù)的特點,提出了“一個數(shù)據(jù)采集點一張表”與“超級表”的概念,設(shè)計了創(chuàng)新的存儲引擎,讓數(shù)據(jù)的寫入、查詢和存儲效率都得到極大的提升。

首先,TDengine 為了讓有數(shù)據(jù)庫經(jīng)驗的從業(yè)者快速上手,直接選擇了以 SQL 為接口語言的設(shè)計策略。所謂“一個數(shù)據(jù)采集點一張表”,就是在設(shè)計數(shù)據(jù)模型時,要對每個數(shù)據(jù)采集點單獨建一張表,用來存儲這個數(shù)據(jù)采集點所采集的時序數(shù)據(jù)。這種設(shè)計有幾大優(yōu)點:

  1. 由于不同數(shù)據(jù)采集點產(chǎn)生數(shù)據(jù)的過程完全獨立,每個數(shù)據(jù)采集點的數(shù)據(jù)源是唯一的,一張表也就只有一個寫入者,這樣就可采用無鎖方式來寫,寫入速度就能大幅提升。
  2. 對于一個數(shù)據(jù)采集點而言,其產(chǎn)生的數(shù)據(jù)是按照時間排序的,因此寫的操作可用追加的方式實現(xiàn),進一步大幅提高數(shù)據(jù)寫入速度。
  3. 一個數(shù)據(jù)采集點的數(shù)據(jù)是以塊為單位連續(xù)存儲的。如果讀取一個時間段的數(shù)據(jù),它能大幅減少隨機讀取操作,成數(shù)量級的提升讀取和查詢速度。
  4. 一個數(shù)據(jù)塊內(nèi)部,采用列式存儲,對于不同數(shù)據(jù)類型,采用不同壓縮算法,而且由于一個數(shù)據(jù)采集點的采集量的變化是緩慢的,壓縮率更高。

由于一個數(shù)據(jù)采集點一張表,導致表的數(shù)量巨增,難以管理,而且應用經(jīng)常需要做采集點之間的聚合操作,聚合的操作也變得復雜起來。為解決這個問題,TDengine 引入了超級表(Super Table,簡稱為 STable)的概念。在 TDengine 的設(shè)計里,表用來代表一個具體的數(shù)據(jù)采集點,超級表用來代表一組相同類型的數(shù)據(jù)采集點集合。

所以在使用 TDengine 時,我們要先創(chuàng)建庫(database),再創(chuàng)建超級表,然后為具體的數(shù)據(jù)采集點創(chuàng)建子表。從創(chuàng)建到管理數(shù)據(jù),都可用自己熟悉的 SQL 語法。TDengine 3.0 新增的流式計算語法,也是直接擴充了 SQL,很容易上手。

當然,硬幣總有兩面。TDengine 為了性能選擇了這樣的設(shè)計,但是像 InfluxDB 的無模式操作,實現(xiàn)起來就要復雜一些。不過 TDengine 也通過內(nèi)部功能提供了無模式寫入功能。

本文簡單對比了 InfluxDB 和 TDengine 的數(shù)據(jù)模型??偨Y(jié)而言,如果沒有數(shù)據(jù)庫相關(guān)背景,InfluxDB 上手比較直觀;如果有 SQL 經(jīng)驗,甚至在業(yè)務(wù)中已經(jīng)用 MySQL 等關(guān)系數(shù)據(jù)庫處理過時序數(shù)據(jù),則 TDengine 更為友好。

更多時序數(shù)據(jù)庫知識點