全部產品
Search
文件中心

Lindorm:如何設計時序資料表

更新時間:Jul 06, 2024

時序資料表可以為您提高查詢和儲存效能,本文介紹如何根據時序資料的來源和情境建立時序資料表。

時序資料樣本

時序資料建模至關重要,需要仔細分析資料來源的特性和查詢的情境,建立合理的資料表,以便達到最佳的儲存和查詢效能。以下圖的空氣檢測資料為例:

時序資料表示意

每個時間點對應的資料記錄可以詳細分為幾個部分:

  • 表(Table):代表一系列同類時序資料的集合。

  • 標籤(Tags):表明指標項監測針對的具體對象屬性。其中一個標籤(Tag)由一個標籤鍵(Key)和一個對應的標籤值(Value)組成。時序引擎預設會為每一個標籤的鍵-值對都建立標籤與時間序列之間的索引。在特定場合下,標籤也可能會有不同的叫法,例如可能被稱為Labels或者Dimensions。

  • 時間戳記(Timestamp):表示該資料記錄對應的產生時間。

  • 欄位(Field):一條資料記錄可以有多個欄位值,表示指標的不同方面。時序引擎不會為欄位建立索引。

表設計的最佳實務

基於以上的資料模型,我們便可以將同一類時序資料的度量(如上圖中的AQM)設計為表名,並按照SQL的CREATE TABLE文法進行表設計。

以上文的空氣品質監測的時序模型為例,可以採用的表定義如下所示。

CREATE TABLE aqm (
    city        VARCHAR TAG,
    district    VARCHAR TAG,
    id          VARCHAR TAG,
    time        TIMESTAMP,
    pm2_5       DOUBLE,
    pm10        DOUBLE,
    so2         DOUBLE,
    no2         DOUBLE,
    PRIMARY KEY(id)  ////單機版執行個體不支援PRIMARY KEY,如果使用的是單機版執行個體,請刪除此行
);

在此定義基礎上,隨後向表中寫資料便可通過INSERT語句來進行:

INSERT INTO aqm (city, district, id, time, pm2_5, pm10, so2, no2) 
VALUES ('hangzhou', 'yuhang', 'HY00001', '2019-04-18 10:00:00', 31.0, 66.0, 10.0, 43.0);

INSERT INTO aqm (city, district, id, time, pm2_5, pm10, so2, no2) 
VALUES ('hangzhou', 'yuhang', 'HY00001', '2019-04-18 10:01:00', 31.2, 66.0, 10.5, 43.1);

也可以通過下述INSERT語句實現批量寫入資料。

INSERT INTO aqm (city, district, id, time, pm2_5, pm10, so2, no2) 
VALUES ('hangzhou', 'yuhang', 'HY00001', '2019-04-18 10:02:00', 31.3, 66.0, 10.0, 42.9),  
('hangzhou', 'yuhang', 'HY00001', '2019-04-18 10:03:00', 31.2, 66.4, 10.3, 43.0);

說明

關鍵字TAG是時序引擎對SQL的文法擴充,用於將表中的部分列標示為“標籤”。為避免在時序資料建表的過程中糾結於應該將哪些欄位應定義為TAG,建議嘗試遵循以下原則:

  • 能夠標示資料擷取源屬性的欄位定義為TAG,特別是能夠唯一標示資料來源的屬性。

  • 應避免使用進程ID,時間關聯屬性等易變值作為標籤,即便這類屬性的類型是字串,仍然建議將其定義為Field。如果使用此類易變屬性作為標籤,將會導致時間軸數量急劇膨脹,並帶來時間軸索引大小劇增,反而不利於查詢。

PRIMARY KEY設計的最佳實務

資料庫會根據PRIMARY KEY進行儲存分區與查詢最佳化,指定PRIMARY KEY的查詢請求將會非常高效,強烈建議建表時指定。

說明

單機版執行個體不支援PRIMARY KEY。

通常建議選擇資料來源的唯一標識作為PRIMARY KEY,情境樣本如下:

  • 物聯網、工業互連網情境,可以採用裝置ID作為PRIMARY KEY。

  • 車連網情境,可以採用車輛唯一標識來作為PRIMARY KEY。

  • 監控情境,可以採用APP ID或者host:port等標識作為PRIMARY KEY。

以上述時序資料表aqm的樣本,如果業務存在大量基於ID的查詢,則指定ID作為PRIMARY KEY是最佳選擇。

CREATE TABLE aqm (
    city        VARCHAR TAG,
    district    VARCHAR TAG,
    id          VARCHAR TAG,
    time        TIMESTAMP,
    pm2_5       DOUBLE,
    pm10        DOUBLE,
    so2         DOUBLE,
    no2         DOUBLE,
    PRIMARY KEY (id)   //單機版執行個體不支援PRIMARY KEY,如果使用的是單機版執行個體,請刪除此行
);
重要

和傳統的關係型資料庫不同,在時序資料表中定義為PRIMARY KEY的列並不要求列的值遵循唯一性限制式,但是需要出現在PRIMARY KEY列表中的列名必須是標籤列。

資料類型選擇的最佳實務

時序引擎當前支援的資料類型可參見資料類型。對於時序資料表的建立,各種列的資料類型選擇的建議如下:

  • 標籤(Tag)列

    聲明為TAG的列固定為VARCHAR類型,無法更改。

  • 時間戳記(Timestamp)列

    在儲存引擎時間戳記實際上會按照BIGINT類型統一存為Epoch時間戳記以便實現更優的時間戳記壓縮。但使用者可結合對時間戳記的計算需求自行選擇在建表時使用BIGINT類型或TIMESTAMP類型。

  • 欄位(Field)列

    理論上欄位列可選擇使用所有資料類型。但出於資料壓縮和查詢計算的角度考慮,應盡量避免使用VARCHAR類型作為欄位列的類型。