高压缩率

高压缩率

在工业互联网和物联网等领域,数据集的价值与其规模是成正比的:应用程序和算法可以使用的数据越多,它们的输出结果就越精确。然而,由众多设备产生的海量数据需要处理,对于大型企业来说,存储成本可能会非常高昂。

但有一个好消息,那就是时序数据非常易于压缩。TDengine 大幅提高了数据压缩率,甚至能将数据集压缩至原始大小的1/10,并且几乎不会影响处理性能。这一切都得益于几个关键的创新点。

列式存储

时序数据库主要用来存储设备随时间变化而产生的数据。这些数据通常以较短的时间间隔进行采集,比如一分钟采集一次,或一秒钟采集一次。这就导致每个数据点与其相邻点的数值十分接近。以每 15s 测量一次温度的设备为例,在这么短的时间内,正常情况下,温度的变化通常不会太大,保持在一个相对稳定的范围内。

和 MySQL 这类采用行式存储的通用数据库不同,TDengine 采用列式存储。

  • 大幅提高压缩率:同一列数据相近,便于压缩;不同数据类型可采用不同压缩算法。
  • 大幅提高分析性能:时序数据的分析,往往是针对一个采集量在一个时间范围段进行的。如果行式存储,会读取大量的无效数据。

采用列式存储,由于这些数据的相似性,即便不使用复杂的压缩技术,也能达到很好的压缩效果。

高压缩率 - TDengine Database 时序数据库
列式存储:将相似的数据存放在一起

两级压缩

TDengine 采用两级压缩技术,即先对数据进行编码,然后在编码的基础上对数据块进行压缩。

TDengine 对数据的编码方式如下:

  • 较小的整数数据类型(INT、TINYINT 等)使用 simple8b 编码。
  • 较大的整数数据类型(BIGINT 和 UBIGINT)和时间戳使用 delta 编码。
  • 浮点数据类型(FLOAT 和 DOUBLE)使用 delta-of-delta 编码。

delta 编码,也称增量编码,是一种在序列数据之间以数据差异(delta)的形式存储或传输数据的方法。例如,对于序列数据 [2, 4, 6, 9, 7],delta 编码会存储 [2, 2, 2, 3, -2],其中每个值表示前一个数据点与当前数据点之间的差异。在时序数据场景下,由于相邻数据点的差异通常较小,Delta编码可以显著减少数据的冗余,从而显著提高压缩效率。

编码后,对于所有的数据类型,会使用标准的数据压缩算法进行压缩。TDengine 默认对所有列使用 lz4 进行压缩。但用户可以在建表时,根据需要配置 zlib、zstd、tsz、xz 或 disabled 等压缩算法,不同的数据类型,可以选择不同的压缩算法。详细可查看《可配置压缩算法》。

存储压缩算法增强后,TDengine 的压缩比预期可再提升一倍以上。

一个设备一张表

为充分利用其数据的时序性和其他数据特点,TDengine 采取一张设备一张表的策略,要求对每个数据采集点单独建表,用来存储这个数据采集点所采集的时序数据。这样的好处是:

  • 每张表里的记录按时间自动排序
  • 新数据记录的写入变成简单的追加操作
  • 数值按列的变化范围更小
  • 设备 ID、标签不会重复存储

这样的设计让 TDengine 在数据压缩率上远超其他时序数据库,同时,也便于数据的管理和查询。

可配置压缩算法

从 TDengine 3.3.0.0 版本开始,TDengine 提供了更高级的压缩功能,用户可以在建表时针对每一列配置是否进行压缩、以及使用的压缩算法和压缩级别。

  • 第一级压缩支持多种编码方法,可扩充, 包括 simple8b、delta-i、delta-d、bit-packing、disabled
  • 第二级压缩支持多种压缩算法,可扩充,包括 lz4、zlib、zstd、tsz、xz、disabled
  • 压缩等级支持 高、中、低三种

详见《可配置压缩算法》。

存储压缩算法增强后,TDengine 的压缩比预期可再提升一倍以上。

Q&A

Q:TDengine 的时序数据压缩率能达到多少?核心解决什么问题?

A:TDengine 能将时序数据压缩至原始大小的1/10,且几乎不影响数据处理性能。其核心解决工业互联网、物联网场景中的 “海量数据存储成本高” 问题 —— 设备持续产生的大量时序数据无需依赖额外存储资源,即可低成本留存,同时保障后续分析性能。

Q:TDengine 为什么采用列式存储?相比行式存储,对压缩率有什么帮助?

A:TDengine 采用列式存储是基于时序数据 “相邻数据点数值相近” 的特点(如 15 秒采集一次的温度数据变化小)。相比行式存储(如 MySQL),列式存储的优势直接提升压缩率:① 同一列数据特征一致、数值相近,更易压缩;② 可针对不同数据类型(如整数、浮点)匹配专属压缩算法,避免行式存储中 “混合数据难适配算法” 的问题。

 Q:TDengine 的 “两级压缩” 技术具体怎么实现?支持哪些编码和压缩算法?

A:TDengine 两级压缩分 “编码→压缩” 两步,针对性降低数据冗余:① 第一级(编码):按数据类型适配算法,如小整数用 simple8b 编码、时间戳用 delta 编码、浮点用 delta-of-delta 编码;② 第二级(压缩):默认用 lz4 算法,用户可在建表时配置 zlib、zstd、tsz、xz 等算法,也可选择禁用。其中 delta 编码通过存储 “相邻数据差异”,大幅减少时序数据冗余。

Q:TDengine “一个设备一张表” 的设计,对提升压缩率有什么作用?

A:“一个设备一张表” 是 TDengine 提升压缩率的关键设计,核心作用包括:① 表内数据按时间自动排序,相邻数据数值变化范围更小,压缩难度降低;② 新数据仅需追加写入,无需调整已有数据结构,避免冗余存储;③ 设备 ID、标签等信息无需重复存储在每条数据中,直接减少数据量,进一步放大压缩效果。

Q:TDengine 支持自定义配置压缩算法吗?具体有哪些可配置选项?

A:从 TDengine 3.3.0.0 版本开始,支持针对每一列自定义压缩配置:① 第一级编码可选 simple8b、delta-i、delta-d 等(或禁用);② 第二级压缩算法可选 lz4、zlib、zstd、tsz 等(或禁用);③ 压缩等级支持高、中、低三档。灵活配置后,压缩比预期可再提升一倍以上,详情可参考《可配置压缩算法》文档。