当前位置: 首页 > news >正文

TDengine 时序数据库实战笔记(20260622)

文章目录

    • 1. 为什么需要时序数据库?(与传统数据库对比)
    • 2. 典型应用场景
    • 3. 为什么选 TDengine?
    • 4. 核心概念速览
    • 5. 逻辑表与物理表:MySQL vs TDengine
      • 5.1 MySQL:逻辑表与物理表
      • 5.2 TDengine:逻辑表与物理表(含时间分区与 vnode 分片)
    • 6. 核心操作速查
      • 6.1 建库(分区 + 保留 + 冷热分层)
      • 6.2 建超级表(带缺省值、分片)
      • 6.3 动态写入(伪代码)
      • 6.4 创建预聚合(TSMA)
    • 7. 性能基线
      • 时间裁剪示例(假设数据库 `duration 10d`)
    • 8. 生产部署架构
    • 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 TDengine

5.1 MySQL:逻辑表与物理表

MySQL

1: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_id='A'ANDts>NOW()-INTERVAL7DAY;

5.2 TDengine:逻辑表与物理表(含时间分区与 vnode 分片)

物理层自动管理

逻辑层

VNode_2

VNode_1

USING 动态生成

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_AWHEREts>=NOW-7d;

核心区别

  • MySQL 逻辑与物理 1:1 映射,所有设备数据混杂。
  • TDengine 逻辑上一设备一子表,物理上数据被时间分区切分文件、vnode 分片并行处理,单设备查询无需扫描其他设备数据,性能极高。

6. 核心操作速查

6.1 建库(分区 + 保留 + 冷热分层)

-- 定义 S3 磁盘(可选)CREATEDISKs3_diskTYPE'S3's3_endpoint'https://s3.example.com's3_bucket'mybucket's3_access_key'your_access_key's3_secret_key'your_secret_key';-- 建库:10天一分区,保留365天,启用冷热分层CREATEDATABASEiot_db duration10d keep365d tiered_storage's3_disk';

6.2 建超级表(带缺省值、分片)

CREATESTABLE meters(tsTIMESTAMP,currentFLOAT,voltageFLOATDEFAULT220-- 不上报则自动填220)TAGS(locationINT,device_typeBINARY(32))vgroups4;-- 4核单机设4

6.3 动态写入(伪代码)

device_id=msg["deviceId"]loc=msg["locationId"]dev_type=msg["deviceType"]current=msg.get("current")voltage=msg.get("voltage")columns=["ts"]values=["now"]ifcurrentisnotNone:columns.append("current");values.append(str(current))ifvoltageisnotNone:columns.append("voltage");values.append(str(voltage))sql=f"INSERT 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)FROMmetersWHEREts>=NOW-7dINTERVAL(1h);

7. 性能基线

  • 单表容量:无硬上限,推荐控制在千万行级。过大时配合时间裁剪预聚合(TSMA)解决。
  • 单行最大长度:48KB(TDengine 3.x)。
  • 慢查询优化:务必带时间条件WHERE ts >= ...开启时间裁剪,配合 TSMA 避免全表扫描。

时间裁剪示例(假设数据库duration 10d

不裁剪(全表扫描)

-- 无时间条件,扫描所有历史分区,几亿行数据全过一遍SELECTavg(current)FROMd_A;

裁剪(只扫描必要分区)

-- 加上时间条件,只扫描最近7天对应的分区(如6.11~6.20和6.21~6.30两个分区)SELECTavg(current)FROMd_AWHEREts>=NOW-7d;

效果:扫描量从几亿行骤降到几百万行,速度提升几十倍。

时间裁剪 + TSMA 联合优化

-- 查询过去30天每小时的均值SELECT_wstart,avg(current)FROMd_AWHEREts>=NOW-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
http://www.jsqmd.com/news/1067411/

相关文章:

  • 已抓取未编入索引处理 GSC:AI写的文章被嫌弃?3招二次优化教你抢救
  • 第03章|分而治之:Sub-Agents 的核心概念与应用价值
  • ⑨番外篇II,FastLLM——老卡也能跑满血DeepSeek
  • AI+产业落地:从试点尝鲜到价值闭环的六大场景
  • 南宁儿童涂氟亲测2026年6月分享
  • 2048游戏模拟
  • 安全组网热门品牌推荐
  • .splat文件是什么?如何优化.splat文件实现流畅加载?
  • 法奥钟表零件自动组装,微米级精密对位,保障走时准确性
  • 中小运营商 5G 核心网建设方案
  • 收藏!AI大模型前端进阶指南:从效率提升到产品落地
  • LineX荣登欧洲权威机器视觉期刊《inspect》
  • 从连接到能源:解密DePIN如何通过密码学验证“真实工作”
  • 【优化求解】基于遗传算法和粒子群算法求解清华校园雨水排水管网定线优化问题附Matlab代码和报告
  • Linux安装vcpkg
  • 高考后大学4年花10万,室内设计培训1个月花几千——算完这笔账我沉默了
  • 从Prompt到Context再到Harness:AI Agent的进化与未来趋势
  • VulnHub 靶机实战:Infosec_Warrior1 从信息收集到 Root 提权全流程
  • Spring Boot + XXL-Job 实现考勤自动补账:缺卡生成、历史回算和幂等设计
  • 从“归档凭证“到“数据资产“——合同智能应用实战思考
  • 工业防潮柜揭秘:量子算力芯片VS传统算力芯片
  • 基于FME的高程点与等高线矛盾检查
  • 让Mac应用保持最新:Latest使用全攻略
  • 10 分钟搭好语音 AI Agent,LiveKit 凭什么成为 OpenAI 的基建选择
  • Emacs AI助手:3个理由让你在编辑器中体验大型语言模型的强大能力
  • DFIG双馈风机、低电压穿越LVRT+转子侧快速短接、网侧矢量补偿控制仿真(带参考文献)
  • PCB建议
  • 探索未来能源:离网光伏系统如何改变生活
  • AI工程师必抢的稀缺资源:SITS 2026官方Behavior Cloning Benchmark Kit(含6类真实机器人任务数据集+基线模型权重)
  • 技术实战 | 抗原-TCR亲和力优化:5步突破免疫治疗瓶颈