数据压缩
Doris 采用列式存储模型组织和存储数据,特别适合分析型负载。由于同一列的数据通常具有相似的分布特性,列式存储为压缩技术提供了天然优势。Doris 内置多种压缩算法,用户可以在建表时根据工作负载的特点,自由选择最合适的压缩方式,以平衡存储成本与查询性能。
快速选型指南
不同的工作负载对压缩有不同诉求。下表给出了常见场景的推荐选择:
| 用户场景 | 推荐算法 | 选择理由 |
|---|---|---|
| 高性能实时分析、高并发查询 | LZ4、Snappy | 解压速度极快,CPU 开销低 |
| 平衡存储成本与查询性能 | ZSTD、LZ4F | 高压缩比,且解压速度仍然较快 |
| 存储效率优先、对查询延迟不敏感 | ZSTD、Zlib | 压缩比最高,节省磁盘空间 |
| 归档与冷数据存储 | Zlib、LZ4HC | 极致压缩比,适合不常访问的数据 |
默认推荐 ZSTD:在大多数场景下能同时获得较好的压缩比和较快的解压速度。
为什么需要压缩
在 Doris 中,数据压缩主要服务于两个目标:
- 降低存储成本:减少数据存储所需的磁盘空间,使同样的物理资源可以承载更多的数据。
- 提升查询性能:压缩后数据体积更小,查询所需的 I/O 操作更少。现代压缩算法解压速度极快,能够在节省存储的同时加速查询响应。
支持的压缩算法
Doris 支持以下压缩算法,每种算法在压缩率与解压速度之间有不同的权衡:
| 压缩类型 | 特点 | 适用场景 |
|---|---|---|
| 无压缩 | 数据不进行压缩。 | 数据已被压缩,或存储空间不是瓶颈的场景。 |
| LZ4 | 压缩与解压速度极快,压缩比适中。 | 实时查询、高并发负载等对解压速度要求高的场景。 |
| LZ4F | LZ4 的扩展版本,支持更灵活的压缩配置;速度快、压缩比适中。 | 需要快速压缩并对配置做细粒度控制的场景。 |
| LZ4HC | 相比 LZ4 有更高的压缩比,但压缩速度较慢;解压速度与 LZ4 相当。 | 关注解压速度,但需要更高压缩比的场景。 |
| ZSTD(Zstandard) | 高压缩比,支持灵活的压缩级别调整;即使在高压缩比下解压速度仍然很快。 | 对存储效率要求较高,且需要兼顾查询性能的场景。 |
| Snappy | 设计重点是快速解压,压缩比适中。 | 对解压速度要求高、CPU 资源紧张的场景。 |
| Zlib | 提供良好的压缩比与速度平衡;压缩和解压速度较慢,但压缩比更高。 | 归档、冷数据存储等对解压速度不敏感的场景。 |
压缩工作原理
Doris 的压缩机制由以下几个层面协同实现:
按列压缩
由于采用列式存储,Doris 对表中每一列独立压缩。同一列的数据通常具有相似的分布特性,因此按列压缩能取得比按行压缩更高的压缩效率。
压缩前编码
在执行压缩之前,Doris 会先对列数据进行编码,将数据转换为更适合压缩的形式,从而进一步提升压缩比。常见编码方式包括:
- 字典编码:将重复字符串替换为更短的字典编号。
- 游程编码(RLE):将连续重复的值用「值 + 重复次数」表示。
按页压缩
Doris 采用页(Page)级别的压缩策略:
- 每一列的数据会被切分成多个页。
- 每个页内的数据独立进行压缩。
- 查询时按需解压目标页,避免全列扫描。
按页压缩既能高效处理大规模数据集,又能保持良好的压缩率与解压性能。
存储格式 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 支持的取值:none、lz4、lz4f、lz4hc、zstd、snappy、zlib。如未显式指定,Doris 将使用系统默认的压缩算法。