數(shù)據(jù)寫入是時序數(shù)據(jù)庫最基礎也是最關鍵的操作之一。高效的寫入策略不僅能提升系統(tǒng)吞吐量,還能降低資源消耗。本文將以TDengine時序數(shù)據(jù)庫為例,詳細介紹數(shù)據(jù)寫入的各種方式和最佳實踐。
一、基礎寫入方式
1.1 單條數(shù)據(jù)寫入
最基礎的寫入方式是向表中插入單條記錄。假設設備ID為d1001的智能電表在2018年10月3日14:38:05采集到數(shù)據(jù):電流10.3A,電壓219V,相位0.31。
INSERT INTO d1001 (ts, current, voltage, phase)
VALUES ("2018-10-03 14:38:05", 10.3, 219, 0.31);
當INSERT語句中的VALUES部分包含了表的所有列時,可以省略VALUES前的字段列表:
INSERT INTO d1001 VALUES("2018-10-03 14:38:05", 10.3, 219, 0.31);
對于表的時間戳列(第一列),也可以直接使用數(shù)據(jù)庫精度的時間戳:
INSERT INTO d1001 VALUES (1538548685000, 10.3, 219, 0.31);
以上三種SQL的效果完全相同。
1.2 批量數(shù)據(jù)寫入
當需要寫入多條數(shù)據(jù)時,可以在一條INSERT語句中寫入多條記錄,顯著提升寫入效率:
INSERT INTO d1001 VALUES
("2018-10-03 14:38:05", 10.2, 220, 0.23),
("2018-10-03 14:38:15", 12.6, 218, 0.33),
("2018-10-03 14:38:25", 12.3, 221, 0.31);
上面的SQL一共寫入了三條數(shù)據(jù),相比執(zhí)行三條單獨的INSERT語句,批量寫入能大幅減少網(wǎng)絡交互開銷。
1.3 多表寫入
對于多個設備的數(shù)據(jù),TDengine支持一次向多個表寫入數(shù)據(jù):
INSERT INTO d1001 VALUES
("2018-10-03 14:38:05", 10.2, 220, 0.23),
("2018-10-03 14:38:15", 12.6, 218, 0.33),
("2018-10-03 14:38:25", 12.3, 221, 0.31)
d1002 VALUES
("2018-10-03 14:38:04", 10.2, 220, 0.23),
("2018-10-03 14:38:14", 10.3, 218, 0.25),
("2018-10-03 14:38:24", 10.1, 220, 0.22)
d1003 VALUES
("2018-10-03 14:38:06", 11.5, 221, 0.35),
("2018-10-03 14:38:16", 10.4, 220, 0.36),
("2018-10-03 14:38:26", 10.3, 220, 0.33);
這條SQL一共寫入了九條數(shù)據(jù),涉及三張不同的表。
二、高級寫入技巧
2.1 指定列寫入
可以通過指定列向表的部分列寫入數(shù)據(jù)。SQL中沒有出現(xiàn)的列,數(shù)據(jù)庫將自動填充為空值(NULL)。注意,時間戳列必須存在,且值不能為空。
INSERT INTO d1004 (ts, voltage, phase)
VALUES("2018-10-04 14:38:06", 223, 0.29);
這條數(shù)據(jù)只包含電壓和相位,電流值為NULL。
2.2 寫入時自動建表
TDengine支持使用帶有USING關鍵字的自動建表語句進行寫入。當子表不存在時,先觸發(fā)自動建表,再寫入數(shù)據(jù);當子表已經(jīng)存在時,則直接寫入。
INSERT INTO d1005
USING meters (location)
TAGS ("beijing.chaoyang")
VALUES ("2018-10-04 14:38:07", 10.15, 217, 0.33);
當子表d1005不存在時,先自動建表,標簽group_id的值為NULL,再寫入數(shù)據(jù)。
自動建表的INSERT語句也支持在一條語句中向多張表寫入數(shù)據(jù):
INSERT INTO d1001 USING meters TAGS ("California.SanFrancisco", 2) VALUES
("2018-10-03 14:38:05", 10.2, 220, 0.23),
("2018-10-03 14:38:15", 12.6, 218, 0.33),
("2018-10-03 14:38:25", 12.3, 221, 0.31)
d1002 USING meters TAGS ("California.SanFrancisco", 3) VALUES
("2018-10-03 14:38:04", 10.2, 220, 0.23),
("2018-10-03 14:38:14", 10.3, 218, 0.25),
("2018-10-03 14:38:24", 10.1, 220, 0.22);
2.3 通過超級表寫入
TDengine還支持直接向超級表寫入數(shù)據(jù)。需要注意的是,超級表是一個模板,本身不存儲數(shù)據(jù),寫入的數(shù)據(jù)是存儲在對應的子表中。
INSERT INTO meters (tbname, ts, current, voltage, phase, location, group_id)
VALUES("d1001", "2018-10-03 14:38:05", 10.2, 220, 0.23, "California.SanFrancisco", 2);
通過指定tbname列向子表d1001寫入一條數(shù)據(jù)。
三、數(shù)據(jù)更新與刪除
3.1 數(shù)據(jù)更新
時序數(shù)據(jù)庫支持通過寫入重復時間戳的數(shù)據(jù)來更新記錄,新寫入的數(shù)據(jù)會替換舊值:
INSERT INTO d1001 (ts, current) VALUES ("2018-10-03 14:38:05", 22);
當子表d1001中已經(jīng)存在日期時間為2018-10-03 14:38:05的數(shù)據(jù)時,current(電流)的新值22會替換舊值。
3.2 數(shù)據(jù)刪除
為方便用戶清理由于設備故障等原因產(chǎn)生的異常數(shù)據(jù),TDengine支持根據(jù)時間戳刪除時序數(shù)據(jù):
DELETE FROM meters WHERE ts < '2021-10-01 10:40:00.100';
這條SQL將超級表meters中所有時間戳早于2021-10-01 10:40:00.100的數(shù)據(jù)刪除。
注意:數(shù)據(jù)刪除后不可恢復,請慎重使用。建議先使用SELECT語句加WHERE后的刪除條件查看要刪除的數(shù)據(jù)內(nèi)容,確認無誤后再執(zhí)行DELETE。
四、零代碼寫入方案
為了方便用戶輕松寫入數(shù)據(jù),TDengine已與眾多知名第三方工具實現(xiàn)無縫集成,包括:
| 工具類型 | 代表工具 |
|---|---|
| 監(jiān)控采集 | Telegraf、collectd、StatsD |
| 消息隊列 | EMQX、HiveMQ、Kafka |
| 監(jiān)控系統(tǒng) | Prometheus |
用戶只須對這些工具進行簡單的配置,便可輕松將數(shù)據(jù)導入TDengine。
此外,TDengine企業(yè)版還提供了豐富的連接器:
- MQTT
- OPC
- AVEVA PI System
- Wonderware
- MySQL
- Oracle
通過在TDengine端配置相應的連接信息,用戶無須編寫任何代碼,即可高效地將來自不同數(shù)據(jù)源的數(shù)據(jù)寫入數(shù)據(jù)庫。
五、寫入性能優(yōu)化建議
5.1 批量寫入優(yōu)先
- 盡量使用批量寫入而非單條寫入
- 單條SQL寫入的數(shù)據(jù)量建議在1000-5000條之間
- 減少網(wǎng)絡交互次數(shù),提升吞吐量
5.2 合理利用自動建表
- 使用自動建表機制簡化應用邏輯
- 避免頻繁的表存在性檢查
- 減少DDL操作的開銷
5.3 時間戳處理
- 優(yōu)先使用數(shù)值型時間戳,減少解析開銷
- 保持時間戳的時區(qū)一致性
- 避免時間戳亂序?qū)懭?/li>
5.4 表設計優(yōu)化
- 合理設計采集量列,避免過多列
- 標簽值不宜過長
- 根據(jù)數(shù)據(jù)特征選擇合適的庫配置
六、壓縮率查看
通過查詢系統(tǒng)表INS_DISK_USAGE,可以查看數(shù)據(jù)庫的壓縮率和磁盤空間:
SELECT * FROM INFORMATION_SCHEMA.INS_DISK_USAGE
WHERE db_name = 'db_name';
通過如下命令,可以查看表的壓縮率及具體分布情況:
SHOW TABLE DISTRIBUTED table_name;
總結(jié)
高效的數(shù)據(jù)寫入是時序數(shù)據(jù)庫發(fā)揮價值的基礎。TDengine時序數(shù)據(jù)庫提供了豐富的寫入方式,從單條寫入到批量寫入,從手動建表到自動建表,從SQL寫入到零代碼集成,滿足不同場景的需求。通過合理選擇寫入策略,開發(fā)者可以充分發(fā)揮時序數(shù)據(jù)庫的性能優(yōu)勢,為物聯(lián)網(wǎng)和工業(yè)數(shù)據(jù)管理平臺提供可靠的數(shù)據(jù)底座。TDengine憑借其高效的寫入能力和靈活的接入方式,成為構(gòu)建實時數(shù)據(jù)庫應用的理想選擇。



互聯(lián)網(wǎng).png)



-1.png)












伙伴.png)



