按列压缩
Doris 采用 列式存储 模型来组织和存储数据,这种存储模型特别适合分析型负载,能够显著提高查询效率。在列式存储中,表的每一列会独立存储,这为压缩技术的应用提供了便利,从而提高了存储效率。Doris 提供多种压缩算法,用户可以根据工作负载的需求,选择合适的压缩方式来优化存储和查询性能。
为什么需要压缩
在 Doris 中,数据压缩主要有以下两个核心目标:
-
提升存储效率 压缩可以显著减少数据存储所需的磁盘空间,支持在同样的物理资源上存储更多数据。
-
优化性能 压缩后的数据体积更小,查询时需要的 I/O 操作更少,从而加速查询响应时间。现代压缩算法的解压速度通常非常快,能够在减少存储空间的同时提升读取效率。
支持的压缩算法
Doris 支持多种压缩算法,每种算法在压缩率和解压速度之间有不同的权衡,可根据需求选择合适的算法:
压缩类型 | 特点 | 适用场景 |
---|---|---|
无压缩 | - 数据不进行压缩。 | 适用于不需要压缩的场景,例如数据已经被压缩或者存储空间不是问题的情况。 |
LZ4 | - 压缩和解压速度非常快。 - 压缩比适中。 | 适用于对解压速度要求高的场景,如实时查询或高并发负载。 |
LZ4F (LZ4框架) | - LZ4的扩展版本,支持更灵活的压缩配置。 - 速度快,压缩比适中。 | 适用于需要快速压缩并对配置有细粒度控制的场景。 |
LZ4HC (LZ4高压缩) | - 相比LZ4有更高的压缩比,但压缩速度较慢。 - 解压速度与LZ4相当。 | 适用于需要更高压缩比的场景,同时仍然关注解压速度。 |
ZSTD (Zstandard) | - 高压缩比,支持灵活的压缩级别调整。 - 即使在高压缩比下,解压速度仍然很快。 | 适用于对存储效率要求较高且需要平衡查询性能的场景。 |
Snappy | - 设计重点是快速解压。 - 压缩比适中。 | 适用于对解压速度要求高且对CPU消耗低的场景。 |
Zlib | - 提供良好的压缩比与速度平衡。 - 与其他算法相比,压缩和解压速度较慢,但压缩比更高。 | 适用于对存储效率要求较高且对解压速度不敏感的场景,如归档和冷数据存储。 |
压缩原理
按列压缩 由于采用列式存储,Doris 能够对表中每一列独立压缩。这种方式提升了压缩效率,因为同一列的数据往往具有相似的分布特性。
压缩前的编码 在压缩数据之前,Doris 会对列数据进行编码(例如字典编码、游程编码等),将数据转换为更适合压缩的形式,从而进一步提升压缩效率。
按页压缩 Doris 采用 页(Page) 级别的压缩策略。每一列的数据会被分成多个页,每个页内的数据会独立进行压缩。通过按页压缩,Doris 能够高效地处理大规模数据集,同时保证高效的压缩率和解压性能。
可配置的压缩策略 用户可以在创建表时指定需要使用的压缩算法。这种灵活性使用户可以根据具体工作负载,在压缩效率和性能之间做出最佳选择。
影响压缩效果的因素
虽然不同的压缩算法有不同的优缺点,但压缩的效果不仅仅依赖于选择的算法,还受以下因素的影响:
数据的序列性(Order of Data)
数据的顺序对于压缩效果有重要影响。对于具有高序列性的列(例如时间戳或连续数值列),压缩算法通常能够获得更好的效果。数据的顺序越有规律,压缩算法在压缩时可以识别出更多的重复模式,从而提升压缩比。
数据的重复度(Data Redundancy)
数据列中重复值越多,压缩效果越明显。例如,使用字典编码对重复值进行编码能够显著降低存储空间。而对于没有明显重复的数据列,压缩效果可能不如预期。
数据的类型(Data Type)
数据的类型也会影响压缩效果。通常,数值类型的数据(如整数和浮点数)比字符串类型的数据更容易压缩。对于浮动范围较大的数据类型,压缩算法的效果可能会受到影响。
列的长度(Column Length)
列中数据的长度也会影响压缩效果。较短的列通常比长列更容易压缩,因为压缩算法在较短数据块上能够更高效地找到重复模式。
空值(Nulls)
列中空值的比例较高时,压缩算法可能会更有效,因为压缩算法会将这些空值作为一种特殊的模式进行编码,减少存储空间。
如何选择合适的压缩算法
选择合适的压缩算法需根据工作负载特性:
- 对于 高性能实时分析 场景,推荐使用 LZ4 或 Snappy。
- 对于 存储效率优先 的场景,推荐使用 ZSTD 或 Zlib。
- 对于需要兼顾速度和压缩率的场景,可选择 LZ4F。
- 对于 归档或冷数据存储 场景,建议使用 Zlib 或 LZ4HC。
在 Doris 中设置压缩
创建表时,可以通过设置压缩算法来指定存储数据的压缩方式:
CREATE TABLE example_table (
id INT,
name STRING,
age INT
)
DUPLICATE KEY(id)
DISTRIBUTED BY HASH(id) BUCKETS 10
PROPERTIES (
"compression" = "zstd"
);