当前位置: 首页 > 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.gsyq.cn/news/1579358.html

相关文章:

  • AI+产业落地:从试点尝鲜到价值闭环的六大场景
  • 第03章|分而治之:Sub-Agents 的核心概念与应用价值
  • 2048游戏模拟
  • 中小运营商 5G 核心网建设方案
  • Linux安装vcpkg
  • 基于FME的高程点与等高线矛盾检查
  • 让Mac应用保持最新:Latest使用全攻略
  • 10 分钟搭好语音 AI Agent,LiveKit 凭什么成为 OpenAI 的基建选择
  • Emacs AI助手:3个理由让你在编辑器中体验大型语言模型的强大能力
  • 前后端分离德州酒吧小程序:存酒管理、扫码点单、在线组局逻辑代码拆解
  • 承接定制AI智能控制会议医疗录播主机
  • RAG 检索精度优化之道:数据清洗与预处理全流程深度解析
  • 【AI原生LoRA技术权威指南】:SITS 2026低秩适配全栈解析——覆盖训练、部署、量化3大实战瓶颈
  • Reproxy:微服务时代边缘代理的终极解决方案
  • DFIG双馈风机、低电压穿越LVRT+转子侧快速短接、网侧矢量补偿控制仿真(带参考文献)
  • 基于KNN算法的健身会员个性化锻炼与饮食方案推荐研究
  • 维铂叁科普知识丨数字防伪印章
  • 从概念验证到百万QPS商用:3家头部AI OS厂商同步采用的插件生命周期管理模型(含GitHub Star超2.4k的开源参考实现)
  • RTKLIB中关于不同的码通道
  • 单模型采样的统计学本质与系统性偏差分析 | 上篇单模型采样的统计学本质与系统性偏差分析 | 上篇
  • 2026 降AI率工具实测对比:公认好用的,科研党救急指南
  • 作为宝妈研究者我给孩子选的脑营养不是最贵的是最对的
  • 为什么92%的AI中台项目在Adapter层失败?20年架构老兵亲授6个反模式诊断清单与即时修复checklist
  • 硬核科技+柔性创新”2026第三代半导体与柔性电子展会抢先看
  • 如何将iPhone上的联系人AirDrop到iPhone上?
  • 表面等离子共振SPR技术结果解析
  • 2026年教师破局指南:老师应该考什么证有用?系统提升路径与核心能力全解析
  • 【小白向】新手快速拥有桌面 AI,虾壳云一键部署 OpenClaw v2.7.9 全程自动配置(最新安装包)
  • 餐桌转盘无刷电机驱动板应用技术与优势解析
  • 鸿蒙6.0应用开发——自动化测试框架开发