首页/数据/NoSQL 速查/列压缩 CODEC 选择
ClickHouse56 条

列压缩 CODEC 选择

CODEC 定义列的压缩算法与编码链:默认 LZ4;ZSTD 压缩率更高;时间戳用 Delta/DoubleDelta、浮点用 Gorilla 等差分编码后再套 ZSTD,能同时改善压缩率与读取。

NoSQL 速查数据更新于 2026-10-13

列压缩 CODEC 是什么

CODEC 定义列的压缩算法与编码链,默认是 LZ4。ZSTD 压缩率更高但更耗 CPU;时间戳列用 Delta 或 DoubleDelta、浮点列用 Gorilla 这类差分编码后再套 ZSTD,能同时改善压缩率与读取效率。压缩是逐列独立进行的,查询只读部分列时也只解压这些列,这正是列式存储在分析场景省 IO 的原因之一。修改列 CODEC 会触发旧数据重写,在大表上是较重的操作。

基本信息

常用组合CODEC(LZ4)、CODEC(ZSTD(3))、CODEC(Delta, ZSTD(3))、CODEC(Gorilla, ZSTD)
按列选择整数与时间戳用 Delta,浮点用 Gorilla,文本用 ZSTD
变更语法ALTER TABLE ... MODIFY COLUMN ... CODEC(...)
变更代价触发旧数据重写,可在 system.mutations 查看进度
所属系统ClickHouse

典型使用场景

  • 时间戳列:DoubleDelta 加 ZSTD,压缩率通常优于单纯 ZSTD
  • 指标浮点列:Gorilla 适合变化平缓的监控数据
  • 长文本列:提高 ZSTD 等级换取更小体积
  • 写入密集表:用中等等级平衡 CPU 与压缩率
  • 存量优化:对历史表的低效列改压缩并接受一次重写

建表与变更

建表与变更
CREATE TABLE metrics2
(
    ts DateTime CODEC(DoubleDelta, ZSTD(3)),
    value Float64 CODEC(Gorilla, ZSTD(3)),
    payload String CODEC(ZSTD(9))
)
ENGINE = MergeTree ORDER BY ts;

-- 已有列改压缩会重写数据,大表要评估耗时与临时空间
ALTER TABLE metrics2 MODIFY COLUMN payload String CODEC(ZSTD(6));

编码器适用对照

编码器适用列说明
LZ4通用默认,解压快,压缩率一般
ZSTD(n)文本与通用等级越高越省空间也越耗 CPU
Delta / DoubleDelta整数与时间相邻值差分后再压缩
Gorilla浮点时序数据压缩效果明显
T64低基数整数取值种类少时效果好
压缩等级越高 CPU 开销越大,写入密集的表用中等级别更平衡;查询只看部分列时解压成本也是按列计算的。
编码器与列类型不匹配会直接报错,Delta 系列只适用于整数与日期类,选择前先确认列的数据类型。
MODIFY COLUMN 改 CODEC 会重写历史数据,进度可以在 system.mutations 里查看,重写期间磁盘 IO 与空间占用都会上升,建议放在低峰执行。
一列可以串多个编码器组成编码链,常见顺序是先做差分编码再压缩,例如 CODEC(Delta, ZSTD(3));顺序颠倒通常得不到预期的压缩效果。

易错点

  • 编码器与列类型不匹配会报错,Delta 系列只适用于整数与日期类
  • 对所有列无脑上最高级 ZSTD 会明显拖慢写入与合并,应按列特性选型
  • 以为改 CODEC 只对新数据生效:ALTER 会重写历史数据,占用 IO 与额外空间
  • 在写入高峰执行大表 CODEC 变更,与后台合并争抢资源导致整体变慢

数据来源与参考

  • ClickHouse Docs: Compression codecs
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌