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



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



-1.png)




.png)


證.png)


伙伴.png)
伙伴.png)
伙伴.png)



