TDengine 是一款专为物联网、车联网和运维监控场景打造的开源时序数据库(Time-Series Database,TSDB)。当你的数据具备”时间戳 + 高频写入 + 按设备聚合”的特征时,传统关系型数据库(包括我们常用的 PostgreSQL 分区表)往往会被写入吞吐和存储成本拖垮,而 TDengine 通过”一个设备一张子表”的超级表模型,把千万级测点的存储与查询压到了极低成本。本文从概念、部署、建模到多语言接入,带你把 TDengine 真正跑起来。
一、TDengine 是什么,为什么值得关注
时序数据指按时间顺序产生的数据点:传感器读数、服务器指标、用户行为埋点都属于这一类。它的典型痛点是”写多读少、数据只追加、过期即可归档”。TDengine 针对这些特征做了三件事:用列存 + 压缩降低存储;用”超级表 + 子表”让单设备独立物理表、整体逻辑统一;内置缓存、订阅和流式计算,省去再接一套 Kafka + 计算引擎的复杂度。
在物联网和监控领域,它常被拿来和 InfluxDB、TimescaleDB 对比。和动辄需要集群调优的方案相比,TDengine 单机即可扛住每秒百万级写入,对小团队尤其友好。
二、核心模型:超级表、子表与标签
TDengine 的建模思想和传统表不同,理解这三个概念是上手关键:
- 超级表(STable):一张”模板表”,定义时序字段(随时间的测量值)和标签(TAGS,描述设备的静态属性,如位置、分组)。所有子表共享它的结构。
- 子表(Subtable):每个具体设备(如一台电表的 d1001)对应一张子表,自动继承超级表的字段,并绑定自己的标签值。
- 标签(TAG):不参与高频变化的维度,用来做聚合切片,比如”查询北京地区所有电表的平均电压”。
这种”一设备一表”的设计,让单设备查询走主键范围扫描极快,而跨设备聚合又能用标签一次搞定。
三、快速起步:Docker 一键部署
最省事的方式是用官方镜像起一个单机实例。如果你熟悉 Docker Compose 一键编排,直接把它加进编排文件即可;本地快速验证用下面这条命令:
docker run -d \
--name tdengine \
-p 6030:6030 -p 6041:6041 \
-v tdengine-data:/var/lib/taos \
tdengine/tdengine:latest
其中 6030 是原生 TDengine 客户端端口,6041 是 RESTful 接口(基于 HTTP,跨语言最方便)。容器起来后用 docker logs tdengine 能看到 “Welcome to TDengine” 即代表就绪。
四、建库建表:一张超级表统领千万设备
进入命令行(docker exec -it tdengine taos)后,先建库,再建超级表。库参数里 KEEP 是数据保留天数,DURATION 是单文件时间跨度,BUFFER 是写入内存缓冲:
-- 建库:保留 365 天,每 10 天一个数据文件,写入缓冲 16MB
CREATE DATABASE IF NOT EXISTS iot KEEP 365 DURATION 10 BUFFER 16;
USE iot;
-- 建超级表:时序字段 + 标签
CREATE STABLE meters (
ts TIMESTAMP,
current FLOAT,
voltage INT,
phase FLOAT
) TAGS (
location BINARY(64),
groupId INT
);
注意时序字段必须包含且以 ts TIMESTAMP 打头,标签用 TAGS 声明,且标签是静态维度、不适合放高频变化的值。
4.1 子表:每个设备一张物理表
每个电表建一张子表,绑定自己的位置与分组标签:
CREATE TABLE d1001 USING meters TAGS ('北京', 1);
CREATE TABLE d1002 USING meters TAGS ('上海', 2);
五、写入数据:子表自动建表与批量插入
标准写法是先建子表再插值;TDengine 也支持在 INSERT 时”用超级表自动建子表”,适合设备动态上线的场景:
-- 方式一:已知子表
INSERT INTO d1001 VALUES (NOW, 10.2, 219, 0.32);
-- 方式二:写入时自动按标签建子表
INSERT INTO d2001 USING meters TAGS ('广州', 3)
VALUES (NOW, 12.1, 220, 0.30);
批量写入建议一条 SQL 带多行,或走 REST 接口批量提交,能显著降低网络往返。对写入性能敏感的读者,可以参考 PostgreSQL 慢查询优化 中”减少小事务”的思路——在 TDengine 里同样是”少而大的批次优于多而小的单行”。
六、查询:时序聚合与按标签切片
TDengine 的查询语法兼容标准 SQL,并扩展了时序专属能力。比如按小时降采样求平均电流:
SELECT AVG(current)
FROM meters
WHERE ts >= '2026-10-01 00:00:00' AND ts < '2026-10-08 00:00:00'
INTERVAL(1h);
按标签做跨设备聚合,一条语句就能拿到各地电压均值的对比:
SELECT location, AVG(voltage), MAX(current)
FROM meters
GROUP BY location;
七、多语言接入:Python / Java / Go
TDengine 提供原生连接器,也能直接走 REST(http://host:6041/rest/sql)。下面用 Python 连接器演示一条带自动建表的写入与查询:
import taos
conn = taos.connect(host='localhost', port=6030,
user='root', password='taosdata', database='iot')
cur = conn.cursor()
cur.execute(
"INSERT INTO d3001 USING meters TAGS ('深圳', 4) "
"VALUES (NOW, 9.8, 218, 0.31)"
)
cur.execute("SELECT AVG(current) FROM meters WHERE groupId = 4")
print(cur.fetchall())
cur.close()
conn.close()
Java 端用官方的 com.taosdata.jdbc.TSDBDriver 走标准 JDBC;Go 用 github.com/taosdata/driver-go/v3。无论哪种语言,都建议把连接初始化和批量提交封装进你已有的 GitHub Actions CI 流水线 做集成测试,避免连接器版本与集群版本漂移。
八、TDengine vs InfluxDB vs TimescaleDB
选型时最常被拿来比较的三款,核心差异如下:
| 维度 | TDengine | InfluxDB | TimescaleDB |
|---|---|---|---|
| 存储底座 | 自研列存 | 自研 TSM | PostgreSQL 扩展 |
| 建模方式 | 超级表 + 子表 | measurement + tag | hypertable 分区 |
| SQL 兼容 | 高(含时序扩展) | 中(InfluxQL/Flux) | 极高(就是 PG) |
| 典型优势 | 写入/压缩极致、单机强 | 生态成熟、云托管方便 | 复用 PG 生态、事务完备 |
| 适用团队 | 物联网/监控、求性价比 | 偏观测、已有 Grafana | 已是 PG 栈、要强事务 |
如果团队已经是 PostgreSQL 技术栈,PostgreSQL 高可用方案 配合 TimescaleDB 扩展能零切换上手;但若你从零做设备数据采集、追求极致写入成本,TDengine 往往是更省心的选择。
九、生产落地的 5 个注意点
- 标签基数别爆炸:标签值应是有限集合(城市、型号),不要把”设备唯一 ID”或”精确到秒的时间”塞进标签,否则子表数量失控。
- 合理设置 KEEP / DURATION:冷数据按保留期自动清理,避免磁盘被历史数据占满。
- 批量写入优于单行:和关系库一样,攒批提交能成倍提升吞吐。
- REST 走内网:6041 端口对跨语言最友好,但建议只在可信网络暴露,公网前加一层反向代理与鉴权。
- 监控自身健康:关注 vnode 状态、磁盘水位和慢查询,必要时对照通用慢查询排查方法做调优。
十、什么样的场景该上 TDengine
一句话判断:数据有时间戳、写入远大于更新、需要按实体聚合,就值得评估。典型落地场景如下:
| 场景 | 是否适合 | 原因 |
|---|---|---|
| 设备传感器采集 | 非常适合 | 高频写入 + 按设备聚合 |
| 服务器/应用监控 | 适合 | 指标类时序,天然适配 |
| 金融交易流水 | 一般 | 需要强事务与回滚,PG 更稳 |
| 订单等业务数据 | 不适合 | 是事务型,非时序 |
总结:TDengine 不是万能库,它是时序场景的”专项利器”。当你被千万级测点的写入成本和存储膨胀困扰时,它用极简的”超级表 + 子表”模型把复杂度收敛,单机即可扛住生产级负载。把它和现有的关系型主库(如 PostgreSQL)配合使用——热时序进 TDengine、业务事务留 PG——往往是最务实的架构组合。



