了解ClickHouse中的数据压缩

less than 1 minute read

了解ClickHouse中的数据压缩有助于在配置、建表时选择恰当的压缩方法,减少数据占用的磁盘空间,节省资源。

ClickHouse 支持两种通用数据压缩方法

  • LZ4:默认压缩方法
  • ZSTD

两者相比,LZ4 更快,但是压缩比要小一些。Compression in ClickHouse一文中提供了一份针对样本数据的测试报告。

因此,可以对不同用途的数据使用不同的压缩方式。比如,对于由小的 parts 组成的热数据使用 LZ4 压缩来提高查询速度,而对于合并成大 parts 的历史数据使用 ZSTD 压缩来降低磁盘占用。

对于MergeTree表引擎可以针对不同大小的 part 设置相应的数据压缩方法:

<compression>
    <case>
      <min_part_size>...</min_part_size>
      <min_part_size_ratio>...</min_part_size_ratio>
      <method>...</method>
      <level>...</level>
    </case>
    ...
</compression>
  • min_part_size:数据part的最小大小
  • min_part_size_ratio:数据part大小和表大小的比例
  • method:压缩方式,可选的值有 lz4,lz4hc,zstd
  • level:压缩等级,见后文所述。

可以设置多个<case>条件块。一个数据part如果匹配到了其中一个条件,那么就会使用对应的压缩方法;如果匹配到了多个条件,那么就使用第一个匹配到的;如果没有匹配到任何条件,那么使用 lz4。

除了全局配置,还可以在建表语句中,使用CODEC关键字指定每一列的压缩方法,例如:

CREATE TABLE codec_example
(
    dt Date CODEC(ZSTD),
    ts DateTime CODEC(LZ4HC),
    float_value Float32 CODEC(NONE),
    double_value Float64 CODEC(LZ4HC(9)),
    value Float32 CODEC(Delta, ZSTD)
)
ENGINE = <Engine>

注意最后一行的CODEC(Delta, ZSTD),这表示CODEC可以由多个组合,就像管道一样使用。

ClickHouse 支持多种通用和特定用途的编解码器。

通用编解码器有:

  • NONE:不压缩
  • LZ4:默认使用的无损压缩算法
  • LZ4HC[(level)]:LZ4 HC(high compression,高压缩比)算法,压缩等级可以配置。等级可选项是[1, 12],默认等级是9,推荐范围是[4, 9]
  • ZSTD[(level)]:ZSTD 压缩算法,压缩等级同样可配置,可选项范围是[1, 22],默认值是1

特定用途的编解码器在有某种特点的数据上可以达到更好的效果,包括:

  • Delta
  • DoubleDelta:适用于单调的Counter型数据
  • Gorilla:适用于变化缓慢的浮点数
  • T64

参考资料:

Comments