跳到主要内容

数据压缩

Doris 采用列式存储模型组织和存储数据,特别适合分析型负载。由于同一列的数据通常具有相似的分布特性,列式存储为压缩技术提供了天然优势。Doris 内置多种压缩算法,用户可以在建表时根据工作负载的特点,自由选择最合适的压缩方式,以平衡存储成本与查询性能。

快速选型指南

不同的工作负载对压缩有不同诉求。下表给出了常见场景的推荐选择:

用户场景推荐算法选择理由
高性能实时分析、高并发查询LZ4、Snappy解压速度极快,CPU 开销低
平衡存储成本与查询性能ZSTD、LZ4F高压缩比,且解压速度仍然较快
存储效率优先、对查询延迟不敏感ZSTD、Zlib压缩比最高,节省磁盘空间
归档与冷数据存储Zlib、LZ4HC极致压缩比,适合不常访问的数据

默认推荐 ZSTD:在大多数场景下能同时获得较好的压缩比和较快的解压速度。

为什么需要压缩

在 Doris 中,数据压缩主要服务于两个目标:

  1. 降低存储成本:减少数据存储所需的磁盘空间,使同样的物理资源可以承载更多的数据。
  2. 提升查询性能:压缩后数据体积更小,查询所需的 I/O 操作更少。现代压缩算法解压速度极快,能够在节省存储的同时加速查询响应。

支持的压缩算法

Doris 支持以下压缩算法,每种算法在压缩率与解压速度之间有不同的权衡:

压缩类型特点适用场景
无压缩数据不进行压缩。数据已被压缩,或存储空间不是瓶颈的场景。
LZ4压缩与解压速度极快,压缩比适中。实时查询、高并发负载等对解压速度要求高的场景。
LZ4FLZ4 的扩展版本,支持更灵活的压缩配置;速度快、压缩比适中。需要快速压缩并对配置做细粒度控制的场景。
LZ4HC相比 LZ4 有更高的压缩比,但压缩速度较慢;解压速度与 LZ4 相当。关注解压速度,但需要更高压缩比的场景。
ZSTD(Zstandard)高压缩比,支持灵活的压缩级别调整;即使在高压缩比下解压速度仍然很快。对存储效率要求较高,且需要兼顾查询性能的场景。
Snappy设计重点是快速解压,压缩比适中。对解压速度要求高、CPU 资源紧张的场景。
Zlib提供良好的压缩比与速度平衡;压缩和解压速度较慢,但压缩比更高。归档、冷数据存储等对解压速度不敏感的场景。

压缩工作原理

Doris 的压缩机制由以下几个层面协同实现:

按列压缩

由于采用列式存储,Doris 对表中每一列独立压缩。同一列的数据通常具有相似的分布特性,因此按列压缩能取得比按行压缩更高的压缩效率。

压缩前编码

在执行压缩之前,Doris 会先对列数据进行编码,将数据转换为更适合压缩的形式,从而进一步提升压缩比。常见编码方式包括:

  • 字典编码:将重复字符串替换为更短的字典编号。
  • 游程编码(RLE):将连续重复的值用「值 + 重复次数」表示。

按页压缩

Doris 采用页(Page)级别的压缩策略:

  1. 每一列的数据会被切分成多个页。
  2. 每个页内的数据独立进行压缩。
  3. 查询时按需解压目标页,避免全列扫描。

按页压缩既能高效处理大规模数据集,又能保持良好的压缩率与解压性能。

存储格式 V3 优化

从 Doris 存储格式 V3 开始,数值类型的编码策略得到了进一步优化:

  • 整数类型默认采用 PLAIN_ENCODING
  • 配合 LZ4 / ZSTD 压缩时,可获得更高的读取吞吐与更低的 CPU 开销。

详情参考 存储格式 V3

可配置的压缩策略

用户可以在建表时指定压缩算法,根据具体工作负载在压缩效率与查询性能之间做出最佳选择。

影响压缩效果的因素

压缩效果不仅取决于所选算法,还受到数据自身特征的影响:

影响因素说明
数据序列性数据顺序越规律(如时间戳、连续数值),压缩算法越容易识别出重复模式,压缩比越高。
数据重复度列中重复值越多,压缩效果越明显;字典编码对高重复度数据尤为有效。
数据类型数值类型(整数、浮点数)通常比字符串类型更易压缩;浮动范围越大,压缩效果越受影响。
列长度较短的列通常比长列更容易压缩,因为压缩算法在较短数据块上能更高效地找到重复模式。
空值(NULL)比例空值比例较高时,压缩算法可将其作为特殊模式编码,进一步减少存储空间。

在 Doris 中配置压缩

建表时通过 PROPERTIES 中的 compression 参数指定压缩算法:

CREATE TABLE example_table (
id INT,
name STRING,
age INT
)
DUPLICATE KEY(id)
DISTRIBUTED BY HASH(id) BUCKETS 10
PROPERTIES (
"compression" = "zstd"
);

compression 支持的取值:nonelz4lz4flz4hczstdsnappyzlib。如未显式指定,Doris 将使用系统默认的压缩算法。