SelectDB支持对数据进行列级别压缩,通过压缩可以有效降低存储空间占用,提升磁盘I/O效率。本文介绍SelectDB支持的压缩算法及如何为表配置压缩策略。
为什么需要压缩
在SelectDB中,数据量往往非常庞大。如果将数据以原始格式存储在磁盘上,会消耗大量的存储空间,同时在查询时也会增加磁盘I/O开销。通过数据压缩,可以实现以下收益:
降低存储成本:压缩后的数据体积通常可缩减为原始数据的20%~50%,显著节省磁盘空间。
提升查询性能:更少的磁盘I/O意味着查询时可以更快速地读取数据,在I/O密集型场景中性能提升明显。
降低网络传输开销:在分布式环境中,节点之间传输压缩后的数据可以减少网络带宽占用。
支持的压缩算法
SelectDB支持以下压缩算法,您可以根据实际业务场景的压缩率和性能需求进行选择:
压缩算法 | 说明 | 特点 |
无压缩(NO_COMPRESSION) | 不对数据进行压缩 | 读写性能最高,但存储空间占用最大 |
LZ4 | 极速压缩算法,压缩和解压速度非常快 | 压缩率适中,适合对读写性能要求高、对存储空间不敏感的场景 |
LZ4F | LZ4的帧格式封装版本 | 与LZ4性能相近,提供更好的流式处理支持 |
LZ4HC | LZ4的高压缩率版本 | 压缩率高于LZ4,压缩速度较慢,但解压速度与LZ4相当 |
ZSTD(推荐) | Facebook开源的高性能压缩算法 | 压缩率和速度均衡,是推荐的默认选择。在大多数场景下可获得较高压缩率和较快的读写性能 |
Snappy | Google开源的压缩算法 | 压缩和解压速度快,压缩率中等,适合对延迟敏感的场景 |
Zlib | 经典的通用压缩算法(gzip格式) | 压缩率高,但压缩速度较慢,适合对存储空间要求极致、对写入性能不敏感的场景 |
压缩原理
SelectDB的数据压缩具有以下特点:
按列压缩:SelectDB采用列式存储格式,同一列的数据类型相同,数据分布特征相似,因此压缩效果通常优于行式存储。
编码前压缩:数据在完成列存编码(如字典编码、RLE编码等)之前进行压缩,以获取更好的压缩效果。
按页(Page)压缩:压缩的基本单位是数据页(Page),一个数据文件由多个Page组成,每个Page独立压缩,能高效地处理大规模数据集,同时保证高效的压缩率和解压性能。
可配置压缩策略:表级别的压缩配置通过建表语句的
PROPERTIES参数指定,对整张表所有列生效。
影响压缩效果的因素
以下因素会影响实际的压缩率:
数据重复性:数据重复率越高,压缩效果越好。例如,低基数的枚举列(如状态码、地区编码)通常有极高的压缩率。
数据类型:数值类型(INT、BIGINT等)和固定长度类型通常有较好的压缩效果;而随机字符串、UUID等高随机性数据压缩效果较差。
数据排列顺序:按照某列排序后,相邻数据值的差异更小,压缩效果更好。SelectDB中通过合理设置排序键可以提升压缩率。
列的长度:较短的列通常比长列更容易压缩,压缩算法在较短数据块上能够更高效地找到重复模式。
空值:列中空值的比例较高时,压缩算法可能会更有效,因为压缩算法会将这些空值作为一种特殊的模式进行编码,减少存储空间。
压缩算法选择:不同算法在不同数据特征下的压缩率存在差异,需根据实际测试结果进行选择。
使用压缩
建表时指定压缩算法
通过在CREATE TABLE语句的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的取值范围为:no_compression、lz4、lz4f、lz4hc、zstd、snappy、zlib。不指定时默认使用lz4压缩。
如何选择合适的压缩算法
在选择压缩算法时,可以参考以下建议:
通用场景(推荐ZSTD):ZSTD在压缩率和读写性能之间取得了较好的平衡,适合大多数OLAP分析场景。
高写入性能场景(推荐LZ4):如果业务对写入吞吐量要求较高,LZ4的极低压缩开销可以减少写入延迟。
极致压缩场景(推荐Zlib):如果存储成本是核心关注点,且对写入速度不敏感(如冷数据归档),Zlib可以提供最高的压缩率。
建议通过测试决定:不同数据集在不同算法下的实际压缩率差异较大,建议在正式上线前使用真实数据进行对比测试,选择最适合的压缩算法。
压缩配置对整张表生效,暂不支持对单列单独指定压缩算法。修改现有表的压缩算法需要通过ALTER TABLE修改compression属性,但修改仅对后续新写入的数据生效,已有数据不会重新压缩。