時序資料表可以為您提高查詢和儲存效能,本文介紹如何根據時序資料的來源和情境建立時序資料表。
時序資料樣本
時序資料建模至關重要,需要仔細分析資料來源的特性和查詢的情境,建立合理的資料表,以便達到最佳的儲存和查詢效能。以下圖的空氣檢測資料為例:
每個時間點對應的資料記錄可以詳細分為幾個部分:
表(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類型作為欄位列的類型。