在物联网和工业场景中,采集的数据往往是结构化的,如何高效存储、快速写入并便捷查询,成为时序数据库面临的核心挑战。TDengine 创新性地采用“一个数据采集点一张表”的设计策略,在保留关系型数据库易用性的同时,充分发挥了时序数据的特性。
关系型模型,降低学习门槛
TDengine 沿用传统关系型数据库的数据模型来管理结构化数据,用户无需重新学习新的数据组织方式,即可轻松上手。这种设计既满足了工业与物联网用户的数据结构需求,也保障了与主流分析工具的兼容性。
一个数据采集点一张表
每个数据采集点在 TDengine 中对应一张独立的表。例如,如果系统中部署了一千万块智能电表,则需在 TDengine 中创建一千万张表,每张表只记录一块电表的全部时序数据。表名通常以采集点 ID 命名(如 d1001),采集的各项指标(如电流、电压、相位等)在表中以列形式存在。
这种设计方式带来了显著优势:
- 无锁写入,极致性能:每个采集点是独立的数据源,只有一个写入者,天然避免了并发写入冲突,TDengine 可采用无锁机制,显著提升写入速度。
- 追加写入,顺序优化:时序数据按时间递增产生,可顺序追加写入,有效降低系统开销,加快处理效率。
- 块状存储,高效查询:单个采集点的数据在存储上是连续的、以块为单位组织,读取特定时间段数据时,几乎无需随机 I/O,查询性能提升数量级。
- 列式压缩,节省空间:数据块内部采用列式存储,不同数据类型匹配不同压缩算法,结合采集量变化的低频特性,压缩率远高于传统方式。
如果采用传统方式将多个数据采集点的数据写入同一张表,由于网络延迟不可控,各采集点数据到达服务器的顺序无法保障,系统必须引入锁机制来确保写入一致性。同时,不同采集点的数据难以实现连续存储,影响后续查询效率与压缩效果。相比之下,采用“一个数据采集点一张表”的方式,可最大程度保障每个采集点的数据写入和查询性能,同时实现更优的数据压缩率。
在 TDengine 中,通常以数据采集点的名称(如 d1001)作为表名。每个采集点可对应多个采集量(如电流、电压、相位等),每个采集量在表中占据一列,数据类型可以为整数、浮点数、字符串等。每张表的首列必须为时间戳(Timestamp 类型),TDengine 会基于该时间戳建立索引,并采用列式存储方式进行数据组织。对于结构复杂的设备(如汽车),由于存在多个数据采集点,通常需要为同一设备创建多张表分别管理。
搭配“超级表”,实现统一建模与灵活查询
为了解决大规模数据管理中的结构统一性问题,TDengine 进一步引入了“超级表”机制。在保留“一个数据采集点一张表”的基础上,用户只需定义一次表结构,即可通过超级表模板批量创建同类采集点的子表。同时,每个子表可通过标签(如地理位置、设备型号、安装时间等)区分,实现灵活筛选与聚合分析。
这一设计充分结合了“结构统一 + 存储独立”的优势,使 TDengine 在管理千万级、甚至十亿级设备时,仍然能够保持高性能写入、低成本存储与灵活查询分析的能力。