TDengine 时序数据库实战笔记(20260622)
文章目录1. 为什么需要时序数据库与传统数据库对比2. 典型应用场景3. 为什么选 TDengine4. 核心概念速览5. 逻辑表与物理表MySQL vs TDengine5.1 MySQL逻辑表与物理表5.2 TDengine逻辑表与物理表含时间分区与 vnode 分片6. 核心操作速查6.1 建库分区 保留 冷热分层6.2 建超级表带缺省值、分片6.3 动态写入伪代码6.4 创建预聚合TSMA7. 性能基线时间裁剪示例假设数据库 duration 10d8. 生产部署架构9. 版本与资源1. 为什么需要时序数据库与传统数据库对比对比维度传统关系型数据库 (如 MySQL)时序数据库 (以 TDengine 为例)数据本质离散事务增删改查均衡按时间顺序产生的结构化数据流写多读少时间处理时间只是一个普通字段时间是“第一公民”自动分区、索引、裁剪写入能力单机每秒几千~几万行单机每秒可达数百万行查询模式多表关联、单条查询按时间范围聚合、降采样、趋势分析存储压缩通用压缩效率一般时序专用压缩压缩比可达 10~30 倍数据保留需手动清理历史数据内置自动过期 (KEEP)按分区直接删除文件核心判断标准如果业务是海量设备持续产生带时间戳的数据且主要查询是看趋势或做统计就应该选时序数据库。2. 典型应用场景车联网每辆车每秒上报 GPS、车速、电池状态等。工业物联网 (IIoT)工厂 PLC、传感器高频采集温度、压力、振动。IT 监控服务器 CPU、内存、网络流量等指标。金融科技交易行情、风险指标计算。3. 为什么选 TDengine独特的“一设备一表”模型单设备数据物理连续存储顺序追加无锁查询极快。极简运维内置时间分区、自动分片、冷热分层、预聚合无需手动分库分表。SQL 兼容学习成本低团队上手快。单机高性能合理配置分片4 核服务器也能支撑海量设备。开源版功能完整分片、TSMA 预聚合、冷热分层、MQTT 订阅等全部免费。4. 核心概念速览概念说明超级表 (STable)定义数据列结构、标签TAGS的模板不存实际数据子表 (Subtable)每个设备对应一张物理子表用于存放该设备的所有数据标签 (TAGS)设备静态属性如位置、型号自动建索引用于分组过滤时间分区 (duration)数据库级设置按天/周/月自动切分物理数据文件分片 (vgroups)超级表级设置将子表打散到多个 vnode 并行处理单机建议设为 CPU 核数冷热分层 (tiered_storage)老数据自动从 SSD 迁移到 S3 对象存储预聚合 (TSMA)提前计算每小时/每天的统计值查询聚合结果时毫秒级返回MQTT 订阅TDengine 可作为 MQTT Broker反向推送数据给外部系统5. 逻辑表与物理表MySQL vs TDengine5.1 MySQL逻辑表与物理表MySQL1:1逻辑表sensor_data一张大表包含所有设备物理文件sensor_data.ibd所有设备数据混合存储实际例子-- 创建一张表所有设备共用CREATETABLEsensor_data(idINTAUTO_INCREMENTPRIMARYKEY,device_idVARCHAR(20),tsTIMESTAMP,currentFLOAT);-- 设备A、B、C的数据全部混插在一起INSERTINTOsensor_data(device_id,ts,current)VALUES(A,NOW(),10.5),(B,NOW(),12.1),(A,NOW(),10.7),(C,NOW(),9.8);-- 查设备A的数据必须全表过滤 device_idSELECT*FROMsensor_dataWHEREdevice_idAANDtsNOW()-INTERVAL7DAY;5.2 TDengine逻辑表与物理表含时间分区与 vnode 分片物理层自动管理逻辑层VNode_2VNode_1USING 动态生成USING 动态生成数据按时间落入落入散列到不同 VNode落入超级表 meters模板定义列与标签子表 d_A子表 d_B分区: 6.1-6.10分区: 6.11-6.20分区: 6.1-6.10分区: 6.11-6.20实际例子-- 1. 建库每10天一个分区CREATEDATABASEiot_db duration10d;-- 2. 建超级表分4个vnode单机4核CREATESTABLE meters(tsTIMESTAMP,currentFLOAT)TAGS(locationINT)vgroups4;-- 3. 写入时自动生成子表INSERTINTOd_AUSINGmeters TAGS(1)VALUES(2026-06-01 08:00:00,10.5);-- 落入某vnode的6.1-6.10分区INSERTINTOd_AUSINGmeters TAGS(1)VALUES(2026-06-12 08:00:00,11.2);-- 落入6.11-6.20分区INSERTINTOd_BUSINGmeters TAGS(2)VALUES(2026-06-01 08:00:00,12.1);-- 散列到另一vnode-- 4. 查询设备A最近7天数据只扫描d_A相关分区无关数据自动跳过SELECT*FROMd_AWHEREtsNOW-7d;核心区别MySQL 逻辑与物理 1:1 映射所有设备数据混杂。TDengine 逻辑上一设备一子表物理上数据被时间分区切分文件、vnode 分片并行处理单设备查询无需扫描其他设备数据性能极高。6. 核心操作速查6.1 建库分区 保留 冷热分层-- 定义 S3 磁盘可选CREATEDISKs3_diskTYPES3s3_endpointhttps://s3.example.coms3_bucketmybuckets3_access_keyyour_access_keys3_secret_keyyour_secret_key;-- 建库10天一分区保留365天启用冷热分层CREATEDATABASEiot_db duration10d keep365d tiered_storages3_disk;6.2 建超级表带缺省值、分片CREATESTABLE meters(tsTIMESTAMP,currentFLOAT,voltageFLOATDEFAULT220-- 不上报则自动填220)TAGS(locationINT,device_typeBINARY(32))vgroups4;-- 4核单机设46.3 动态写入伪代码device_idmsg[deviceId]locmsg[locationId]dev_typemsg[deviceType]currentmsg.get(current)voltagemsg.get(voltage)columns[ts]values[now]ifcurrentisnotNone:columns.append(current);values.append(str(current))ifvoltageisnotNone:columns.append(voltage);values.append(str(voltage))sqlfINSERT INTO{device_id}USING meters TAGS ({loc}, {dev_type}) ({, .join(columns)}) VALUES ({, .join(values)})6.4 创建预聚合TSMA-- 每小时自动计算平均电流和最大电流CREATETSMA tsma_hourlyONmeters METRICS(avg(current),max(current))INTERVAL(1h);-- 查询过去7天每小时平均电流自动命中TSMA毫秒级返回SELECT_wstart,avg(current)FROMmetersWHEREtsNOW-7dINTERVAL(1h);7. 性能基线单表容量无硬上限推荐控制在千万行级。过大时配合时间裁剪和预聚合TSMA解决。单行最大长度48KBTDengine 3.x。慢查询优化务必带时间条件WHERE ts ...开启时间裁剪配合 TSMA 避免全表扫描。时间裁剪示例假设数据库duration 10d不裁剪全表扫描-- 无时间条件扫描所有历史分区几亿行数据全过一遍SELECTavg(current)FROMd_A;裁剪只扫描必要分区-- 加上时间条件只扫描最近7天对应的分区如6.11~6.20和6.21~6.30两个分区SELECTavg(current)FROMd_AWHEREtsNOW-7d;效果扫描量从几亿行骤降到几百万行速度提升几十倍。时间裁剪 TSMA 联合优化-- 查询过去30天每小时的均值SELECT_wstart,avg(current)FROMd_AWHEREtsNOW-30dINTERVAL(1h);时间裁剪只扫30天内的3个分区。TSMA 命中直接读取预计算好的每小时汇总表不碰原始数据。结果从几亿行原始数据 → 几千行汇总结果毫秒级返回。8. 生产部署架构设备 → MQTT Broker → Kafka(削峰) → 你的程序 → TDengine(SSD热 S3冷) ↕ (可选) MQTT订阅 → 大屏/告警9. 版本与资源TDengine OSS (开源版)免费功能完整。TDengine Enterprise (企业版)收费含 IDMP 工业平台、资产树、可视化、告警等。官方文档https://docs.taosdata.com/下载地址https://github.com/taosdata/TDengine/releases/latest