ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

TDengine 数据压缩配置全指南:逐列编码与压缩算法(ENCODE / COMPRESS / LEVEL)实战解析

TDengine 数据压缩配置全指南:逐列编码与压缩算法(ENCODE / COMPRESS / LEVEL)实战解析 TDengine 数据压缩配置全指南逐列编码与压缩算法ENCODE / COMPRESS / LEVEL实战解析【免费下载链接】TDengineHigh-performance, scalable time-series database designed for Industrial IoT (IIoT) scenarios项目地址: https://gitcode.com/GitHub_Trending/tde/TDengine导读本文围绕 TDengine 自 3.3.0.0 版本起提供的逐列数据压缩配置能力展开介绍如何在建表时为每一列指定一级编码Encoding算法、二级压缩Compression算法及压缩级别并通过ALTER TABLE ... MODIFY COLUMN动态调整既有列最终用DESCRIBE校验生效结果。读完本文你将掌握 TDengine 两级压缩体系的工作原理、各数据类型的算法与默认值选择以及在实际 IIoT 场景中平衡压缩率与读写性能的配置方法。为什么需要逐列配置压缩TDengine 面向工业物联网IIoT场景数据量大、采集频率高存储成本与查询性能是核心矛盾。传统方案往往对整个数据库或整张表一刀切地采用同一套压缩策略但不同类型的列数据特征差异巨大设备状态量BOOL高度重复适合按位打包传感器读数FLOAT/DOUBLE连续波动差分与字节流拆分更有效主键时间戳TIMESTAMP严格递增差分编码收益显著字符串与 JSON 等类型本身难以用数值算法编码应跳过编码直接走通用压缩器。因此TDengine 允许在列粒度上自由组合“编码 压缩 级别”三要素让压缩策略贴合数据本身规律。压缩术语两级压缩与压缩级别压缩阶段Compression StagesTDengine 的列压缩分为两个阶段一级压缩编码对列数据先做编码处理编码本身即是一种压缩形式。它利用数据在取值域上的规律重复、差分、位分布等将原始字节流转换为更紧凑的表达为二级压缩提供更友好的输入。二级压缩压缩在编码后的数据块上进一步执行通用压缩算法如 lz4、zstd消除跨数值的统计冗余。压缩级别Compression Levels压缩级别特指二级压缩算法内部的工作档位。以 zstd 为例其内部可提供至少 8 个级别不同级别在压缩比、压缩速度、解压速度上各有取舍。为避免用户面对过多档位难以抉择TDengine 将其简化为三个语义级别级别语义取舍high最高压缩比压缩与解压速度相对最慢适合冷数据归档、磁盘成本敏感场景low最快压缩/解压速度压缩比相对最低适合高频写入、热数据查询场景medium均衡在压缩比、压缩速度与解压速度之间取得平衡也是系统默认值从源码实现看这三个语义级别最终被映射为各压缩算法内部的具体档位。在 source/util/src/tcompression.c 的compressL2LevelDict表中可以看到真实映射关系TCmprLvlSet compressL2LevelDict[] { {unknown, .lvl {1, 2, 3}}, {lz4, .lvl {1, 2, 3}}, {zlib, .lvl {1, 6, 9}}, {zstd, .lvl {1, 11, 22}}, {tsz, .lvl {1, 2, 3}}, {xz, .lvl {1, 6, 9}}, };也就是说low/medium/high分别对应 lz4 的 1/2/3 档、zlib 与 xz 的 1/6/9 档、zstd 的 1/11/22 档从而让用户无需关心算法内部的数值级参数。算法清单与各类型默认值TDengine 支持的算法分为两类编码算法一级压缩simple8b、bit-packing、delta-i、delta-d、bss字节流拆分 byte-stream-split、disabled压缩算法二级压缩lz4、zlib、zstd、tsz、xz、disabled其中tsz仅适用于FLOAT和DOUBLE其余压缩算法可广泛使用。各数据类型可用的编码算法、压缩算法及默认配置如下数据类型可用编码算法默认编码算法可用压缩算法默认压缩算法默认压缩级别INT/UINTdisabled/simple8bsimple8blz4/zlib/zstd/xzlz4mediumTINYINT/UTINYINT/SMALLINT/USMALLINTdisabled/simple8bsimple8blz4/zlib/zstd/xzzlibmediumBIGINT/UBIGINTdisabled/simple8b/delta-isimple8blz4/zlib/zstd/xzlz4mediumTIMESTAMPdisabled/delta-idelta-ilz4/zlib/zstd/xzlz4mediumFLOAT/DOUBLEdisabled/delta-d/bssbsslz4/zlib/zstd/xz/tszlz4mediumBINARY/NCHARdisableddisabledlz4/zlib/zstd/xzzstdmediumBOOLdisabled/bit-packingbit-packinglz4/zlib/zstd/xzzstdmediumDECIMALdisableddisabledlz4/zlib/zstd/xzzstdmedium源码中的默认值印证上述默认值并非文档中的孤立描述而是由源码直接实现。在 source/common/src/tcol.c 的getDefaultEncode中整数族含TINYINT/SMALLINT/INT/BIGINT及对应无符号类型默认simple8bFLOAT/DOUBLE默认bss字节流拆分TIMESTAMP默认delta-i源码内部名为 XORBOOL默认bit-packing源码内部名为 RLE而BINARY/NCHAR/DECIMAL/JSON 等类型默认disabled。压缩默认值则在getDefaultCompresssource/common/src/tcol.c中定义整数族中的TINYINT/UTINYINT/SMALLINT/USMALLINT默认zlib其余整数与TIMESTAMP、FLOAT/DOUBLE默认lz4BINARY/NCHAR/DECIMAL与BOOL默认zstd。压缩级别的默认值统一为medium对应 source/common/src/tcol.c 中的getDefaultLevel。这些算法名称的字符串常量如simple8b、delta-i、bit-packing、bss与内部枚举值一一对应定义于 include/common/tcol.h是 SQL 解析层与存储层之间传递压缩配置的契约。各编码算法的适用直觉simple8b把一组小整数打包进 64 位字对数值范围小、值域集中的整数列压缩比高delta-i对相邻整数值做差分后再编码适合时间戳、单调递增计数等序列delta-d对浮点数的字节表示做差分适合相邻值变化缓慢的浮点序列bss按字节位平面拆分浮点数的字节流对波动数据友好bit-packing按位打包对BOOL等取值极少的列近乎最优disabled跳过编码阶段直接进入二级压缩。SQL 语法与实操建表时指定压缩配置在CREATE TABLE的列定义中通过ENCODE、COMPRESS、LEVEL三个可选子句为列配置压缩三者均可省略CREATE TABLE [db_name.]tb_name ( col_name col_type [ENCODE encode_type] [COMPRESS compress_type] [LEVEL level] [, ...] );参数说明tb_name普通表或超级表supertable的表名encode_type一级压缩编码算法取值见上文算法清单须与列类型匹配compress_type二级压缩算法取值见上文算法清单level二级压缩级别默认medium同时支持缩写h/l/m。示例CREATE TABLE meters ( ts TIMESTAMP ENCODE delta-i COMPRESS lz4 LEVEL medium, vol INT ENCODE simple8b COMPRESS zstd LEVEL high, cur FLOAT ENCODE bss COMPRESS tsz LEVEL low, status BOOL COMPRESS zstd, loc BINARY(64) COMPRESS zstd );上面的示例演示了三种典型配置时间戳用差分编码 lz4对冷归档的电压列追求极致压缩比zstd high对电流列追求最快吞吐tsz lowstatus与loc仅指定二级压缩编码与级别沿用类型默认值。超级表的列定义同样支持ENCODE、COMPRESS、LEVEL语法可参见 创建超级表CREATE STABLE [IF NOT EXISTS] [db_name.]stb_name (col_name type_name [COMPOSITE KEY] [ENCODE encode_type] [COMPRESS compress_type] [LEVEL level_type], ...) TAGS (create_definition [, create_definition] ...);在 source/libs/parser/inc/sql.y 中column_def规则将列定义与column_options绑定而column_options通过NK_ID(C) NK_STRING(D)的形式接收ENCODE ...这类键值对source/libs/parser/inc/sql.y最终由解析器转交给createColumnDefNode构建列的压缩元数据。修改已有列的压缩方式使用ALTER TABLE ... MODIFY COLUMN动态调整列压缩配置无需重建表ALTER TABLE [db_name.]tb_name MODIFY COLUMN col_name [ENCODE encode_type] [COMPRESS compress_type] [LEVEL level];参数说明tb_name表名可以是超级表或普通表col_name要修改压缩设置的列名只能是普通数据列不能是标签列。示例-- 将电压列改为高压缩比配置 ALTER TABLE meters MODIFY COLUMN vol COMPRESS zstd LEVEL high; -- 仅调整压缩级别编码与压缩算法保持原值 ALTER TABLE meters MODIFY COLUMN cur LEVEL low;从语法规则看MODIFY COLUMN col_name column_options被映射为TSDB_ALTER_TABLE_UPDATE_COLUMN_COMPRESS操作source/libs/parser/inc/sql.y即修改列时若不带新的type_name则只更新压缩相关属性不影响列的数据类型而ADD COLUMN同样支持携带column_optionssource/libs/parser/inc/sql.y。查看列的压缩方式DESCRIBE [db_name.]tb_name;DESCRIBE输出表的基本列信息包括列类型与压缩设置编码算法、压缩算法与级别可用于校验建表或ALTER操作后的实际生效值。选型建议与实践考量结合算法特性与默认配置可参考以下选型思路默认值即合理起点TDengine 针对每种类型精心选择了默认组合如TIMESTAMP用delta-ilz4、浮点用bsslz4、字符串用zstd大多数场景无需干预写密集场景优先low级别 lz4保证写入与查询吞吐存储成本敏感场景对不常查询的列如归档数据用high级别 zstd/xz换取更高压缩比时序浮点列可尝试tsz它是专为时间序列浮点数据设计的压缩器但仅适用于FLOAT/DOUBLE修改后立即生效ALTER TABLE ... MODIFY COLUMN只影响修改之后写入的新数据块历史数据块仍保留写入时的压缩方式查询时自动按块头记录的算法解压对应用透明。兼容性说明新增的逐列压缩配置能力与既有数据完全兼容存量表与存量数据无需任何迁移即可继续使用新配置从修改时刻起对后续写入生效由于 3.3.0.0 引入了新的压缩元数据管理方式升级到 3.3.0.0 之后无法回退到更低版本升级前请做好版本规划与数据备份。延伸阅读创建超级表超级表列定义中ENCODE/COMPRESS/LEVEL的完整语法source/common/src/tcol.c默认编码、默认压缩算法与默认级别的具体实现include/common/tcol.h算法名称字符串与内部枚举值的完整映射source/util/src/tcompression.clow/medium/high到各压缩算法内部档位的映射表source/libs/parser/inc/sql.yADD COLUMN/MODIFY COLUMN携带压缩选项的语法规则【免费下载链接】TDengineHigh-performance, scalable time-series database designed for Industrial IoT (IIoT) scenarios项目地址: https://gitcode.com/GitHub_Trending/tde/TDengine创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进