日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

如何設計時序數據表

時序數據表可以為您提高查詢和存儲性能,本文介紹如何根據時序數據的來源和場景建立時序數據表。

時序數據示例

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

時序數據表示意

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

  • 表(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類型作為字段列的類型。