数据压缩算法没有绝对最优解,选定哪种压缩算法,本质是在计算成本和存储成本之间找一个平衡点,而性价比的终点取决于你的数据冷热属性和查询模式。
压缩算法牵扯的不只是压缩率高不高,同一个压缩任务,你用zstd和用gzip跑出来的结果,CPU占用率和耗时可能相差一个数量级,很多团队在早期图省事选了默认压缩策略,等数据量涨到几十TB才发现,存储省下的钱还不够补计算资源超卖的部分,本文从负载特征、压速比、生态兼容三个维度拆解,帮你找到适合业务的那个选择。
数据压缩算法怎么选?先看负载类型和查询频次
选压缩算法前,先回答一个问题:你的数据是被“高频读取”还是“低频归档”?这决定了选型的大方向。
读多写少的数据,压缩率优先于压缩速度
典型场景是数据仓库、历史订单表、日志冷存储,这类数据写入后就很少改动,但每次跑分析任务都要全表扫描,业内专家指出,这种场景下选择高压缩率算法更划算,因为CPU成本发生在一次性写入阶段,而存储和扫描成本是持续存在的。
适合的算法包括:
- Zstandard(zstd):在压缩率和速度之间平衡得极好,Level 3默认档位就比gzip高约10%到15%的压缩率,速度快3到5倍
- LZMA/XZ:追求极致压缩率,适合“写入一次、几乎不读”的备份归档,但压缩耗时会明显拉长
- Brotli:偏向文本类数据的压缩表现,常用于静态资源打包,在数据库冷存储场景中不如zstd通用
写多读少的数据,压缩速度优先于压缩率
典型场景是实时日志采集、消息队列(Kafka)、时序数据库,压缩发生在写入链路末端,压缩算法太慢会直接拖垮生产者吞吐量,造成积压。
此时推荐:
- LZ4:压缩速度极快(可到500MB/s以上),压缩率中等,但CPU占用极低
- Snappy:Google出品的平衡方案,速度略慢于LZ4但压缩率略好,生态兼容性最好(Hadoop、Cassandra、Kafka默认支持)
- zstd的极速档位(Level 1或2):压缩速度接近LZ4,压缩率却优于Snappy,适合想统一压缩工具的团队
行业共识认为,“压缩算法消耗的每一毫秒CPU,都应该在存储成本里找到对应回报”,如果一张冷表每月查询不到十次,就没必要用LZ4快进快出,转用zstd高压缩级别更合算。
压缩率与吞吐量的博弈:算清CPU开销和存储节省的账
很多人在对比压缩算法时只看压缩率表格,忽略了CPU本身也是钱,压缩算法的性价比公式很简单:
(节省的存储成本)-(增加的CPU/时间成本)= 净收益
用真实负载测试代替压缩率表格
厂商文档里的压缩率数据都是用标准语料库测出来的,跟你的业务数据可能相差甚远,建立一套可复现的测试流程更靠谱,
- 准备一个5GB到10GB的真实表或日志文件
- 用官方基准工具跑通所有候选算法(zstd内置
zstd -b可以输出压缩率、压缩解压速度) - 观察同一份数据在不同压缩级别下的编译结果
- 记录服务器的CPU使用峰值,特别是写入时段的核数占用情况
下表是一个典型对比(数据来自通用文本日志文件,实际比例因数据特征而异):
| 算法 | 压缩级别 | 压缩率 | 压缩速度 | 解压速度 | 适用场景 |
|---|---|---|---|---|---|
| zstd | 3(默认) | 较高 | 快 | 极快 | 绝大多数通用在线数据 |
| zstd | 9~15 | 很高 | 中等 | 极快 | 冷数据、归档、备份 |
| zstd | 1~2 | 中等 | 极快 | 极快 | 实时写入链路 |
| LZ4 | 默认 | 中低 | 极快 | 极快 | 实时日志、流水数据 |
| Snappy | 默认 | 中低 | 很快 | 很快 | Kafka、Hadoop生态 |
| gzip | 6 | 中等偏低 | 慢 | 慢 | 传统文件压缩、兼容需求 |
| LZMA | 默认 | 极高 | 非常慢 | 中等 | 需要极限压缩率的OFFLINE备份 |
压缩对查询性能的影响不只在解压那一步
压缩数据在磁盘上占用空间小,磁盘IO开销降低了,但解压需要消耗CPU,对于IO密集型查询(全表扫描、OLAP分析),压缩在多数情况下是净收益;但对于CPU密集型查询(复杂join、正则匹配),解压开销可能让查询变慢几倍。
一个重要操作路径:开启数据库的压缩监控指标,比如MySQL的Innodb_compression_time和Innodb_compression_count可以直接看到压缩花费了多少CPU周期,统计一周的监控数据,把压缩时间开销和剩余空间成本放在一起算,就知道当前压缩级别合不合算,PostgreSQL用户可以用pg_stat_compaction视图查看toast表的压缩情况,调整column_compression参数。
压速比的微观调控:参数层级和块大小
选定了算法类别,工作还没结束,同一种算法,不同参数的性价比差距可能超过两倍。
zstd是“分级最细腻”的通用算法
从Level 1到Level 22,每上升一级,压缩率提升幅度逐步缩小,但耗时指数级上升。Level 3到6之间是性价比最陡峭的区间,性价比最高,Level 10以上的提升往往不足5%,压缩时间却可能翻数倍,业务中优先使用Level 3,遇到磁盘紧张时尝试Level 9,一般不推荐超过Level 15。
块大小(window size)直接影响压缩率和内存占用
- 小块(16KB~64KB)适合单条记录短、随机读取多的数据,内存占用低,但压缩率有限
- 大块(256KB~1MB)适合连续读取的大字段,压缩率显著提升,但解压时占内存更高,热点缓存命中率下降
做列式存储选型时(比如Parquet表格),推荐用zstd + 1MB块 + 压缩级别5的配置组合。
列式存储的压缩算法选择
列式存储(ClickHouse、Parquet、ORC)跟行式存储的访问模式完全不同,压缩策略也有差异,ClickHouse内置的CODEC(ZSTD, 3)最通用,但针对重复度极高的列(如枚举值、时间戳),CODEC(Delta, ZSTD)或CODEC(Gorilla)能提升一倍的压缩率,下表给出建议:
- 数值型列:先用
Delta做差值编码,再交给zstd - 字符串型列:直接用
LZ4高频查询,用ZSTD低频统计 - 时间戳列:用
Gorilla算法(时序专用,压缩率极高)
配置写法示例(ClickHouse):
CREATE TABLE events (
ts DateTime CODEC(Delta, ZSTD(3)),
uid UInt64 CODEC(ZSTD(5)),
city String CODEC(LZ4HC(3))
) ENGINE = MergeTree
ORDER BY ts;
混合压缩策略:给不同重要程度的数据配不同档位
很多系统设计者走进一个误区:试图用一套压缩方案打天下,业界的落地经验是按数据生命周期分段配置:热数据用低压缩率高速度,温数据用平衡档,冷数据用极限压缩率,这种方式能最大化整体性价比。
操作案例如下:
- 在线交易表(近7天):不压缩或LZ4快速压缩,保持读写延迟稳定
- 历史订单表(3个月内):zstd Level 3,兼顾查询速度和空间
- 归档备份表(一年前):zstd Level 15或LZMA,彻底压榨存储空间
混合策略还有一个好处:压缩算法的切换成本可控,你可以分批通过后台任务把旧数据重写为新的压缩格式,不影响线上业务,但要注意,预算中要计算重写过程的CPU和IO消耗,相当于用算力换长期的存储收益,可以用分区分桶设计,让每个分区的压缩算法独立调整,避免全表重写。
压缩算法选型的避坑指南
不要盲目迷信“最高压缩率”
LZMA的压缩率确实傲视群雄,但压缩速度慢到令人发指,解压也需要大量内存,用在在线业务上,意味着每次访问都有几倍延迟,数据更新频繁的表不建议使用LZMA。
检查生态兼容性和库版本
Hadoop生态自带的压缩编解码器主要支持gzip、bzip2、LZO、Snappy、zstd(新版本),如果你的数据要经过多套系统流转,选一个全链路都能解压的算法更重要。兼容性问题的修复成本远高于压缩率节省的成本。
压缩级别的调整要配合数据类型
JSON日志和CSV文本的重复度差异巨大,同样的zstd Level 3,对JSON可能压掉80%,但对着二进制序列化数据可能只压掉30%,定期抽样验证,别永远用一套参数。
要不要考虑磁盘类型的影响
机械盘上IO是瓶颈,高压缩率算法(zstd Level 9)因为减少了磁盘读取量,即使CPU开销增加也往往更快;而NVMe固态盘上CPU才是瓶颈,应该选LZ4或zstd低级别,同时要注意大压缩块在机械盘上会拖慢随机读的速度,使用高压缩率时尽量配合顺序读取模式。
数据压缩算法性价比常见问题
数据压缩算法哪个最快?LZ4还是Snappy?
纯从压缩速度看,LZ4通常比Snappy快20%到40%,LZ4在单核上能跑出1GB/s以上的吞吐,Snappy的优势是生态兼容性更好,Hadoop、Kafka、Cassandra都是默认集成Snappy,几乎不需要改代码就能用,追求极致写入速度且可以接受额外依赖,选LZ4;想让现有系统少踩坑,选Snappy,如果业务以后可能引入大数据组件,Snappy的通用性更常被推荐。
压缩算法选型时应该考虑存储介质类型吗?
应该考虑,机械硬盘环境下,压缩算法的随机读取性能更关键,高压缩率算法能显著减少磁头移动,固态硬盘环境下,压缩带来的IO收益相对有限,CPU开销成为主要成本,实际场景中,建议对存储服务器做一个简单的IO压力测试用相同数据集分别在机械盘和固态盘上跑同一种压缩算法的查询负载,对比资源占用差异,混合存储架构中,也可以按介质分配合适的压缩策略。
zstd的压缩级别多少最划算?
没有统一数字,但综合大多数实际案例,Level 3到6是性价比最集中的区间,Level 3适合日常在线业务,Level 6适合不太频繁访问但还需要保留快速查询能力的数据,如果数据超过半年未被访问,再考虑Level 9以上,并配合归档存储服务使用,验证方式:取真实业务数据分级别压一遍,对比时间和压缩率,在压缩率曲线上找一个“拐点”。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/638994.html





