列压缩 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));顺序颠倒通常得不到预期的压缩效果。