ClickHouse性能调优——压缩和编码算法

文章探讨了ClickHouse中的数据压缩,特别是LZ4和ZSTD压缩算法的使用。通过对CellTowers数据集的测试,显示ZSTD在压缩率上优于LZ4。此外,还讨论了列压缩编码,包括通用编码和特定编码,如Delta和DoubleDelta等,强调压缩效果受数据类型、基数和特征影响。压缩策略的选择应考虑数据特性和性能需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

随着数据库数据越来越多,给数据存储、网络访问造成成本和负担。压缩技术节约存储空间、加速网络访问的常用解决方案,本文主要介绍压缩算法和ClickHouse编码技术。

压缩类型

ClickHouse协议支持LZ4和ZSTD 压缩算法,两者都是基于字典使用校验和的压缩算法,LZ4较快、但压缩率比ZSTD较低。你可以选择合适算法,缺省为LZ4,当不确定选择哪种算法时建议使用LZ4。对于MergeTree引擎表,数据压缩设置可以在config.xml文件中设置:

<?xml version="1.0" ?>
<clickhouse>
  <compression incl="clickhouse_compression">
    <case>
      <min_part_size>104857600</min_part_size>
      <min_part_size_ratio>0.01</min_part_size_ratio>
      <method>zstd</method>
      <level>3</level>
    </case>
  </compression>
</clickhouse>

我们可以查看表的压缩率,对比压缩效果:这里使用Cell Towers数据集,包括43百万数据。相同数据使用不同压缩算法,对比结果如下:

Table NameCompressed Table Size(GB)Uncompressed Table Size(GB)Compression Ratio
cell_towers_LZ41,072,061,92
cell_towers_zstd0,842,062,45

现在让我们看下每列压缩率,下表使用LZ4压缩算法,基数和数据类型是影响压缩比的主要因素。

┌─Column Name───┬─Column Type─┬─compressed─┬─uncompressed─┬─Compression Ratio─┬─compression_codec─┐
│ changeable    │ UInt8       │ 188.32 KiB │ 41.27 MiB    │            224.41 │                   │
│ averageSignal │ UInt8       │ 188.32 KiB │ 41.27 MiB    │            224.41 │                   │
│ radio         │ Enum8(''    │ 188.38 KiB │ 41.27 MiB    │            224.35 │                   │
│ mcc           │ UInt16      │ 384.88 KiB │ 82.54 MiB    │            219.61 │                   │
│ net           │ UInt16      │ 410.99 KiB │ 82.54 MiB    │            205.66 │                   │
│ unit          │ Int16       │ 2.12 MiB   │ 82.54 MiB    │             38.86 │                   │
│ range         │ UInt32      │ 48.27 MiB  │ 165.09 MiB   │              3.42 │                   │
│ samples       │ UInt32      │ 77.14 MiB  │ 165.09 MiB   │              2.14 │                   │
│ created       │ DateTime    │ 87.37 MiB  │ 165.09 MiB   │              1.89 │                   │
│ cell          │ UInt64      │ 178.76 MiB │ 330.17 MiB   │              1.85 │                   │
│ area          │ UInt16      │ 48.29 MiB  │ 82.54 MiB    │              1.71 │                   │
│ lat           │ Float64     │ 259.85 MiB │ 330.17 MiB   │              1.27 │                   │
│ lon           │ Float64     │ 261.98 MiB │ 330.17 MiB   │              1.26 │                   │
│ updated       │ DateTime    │ 130.71 MiB │ 165.09 MiB   │              1.26 │                   │
└───────────────┴─────────────┴────────────┴──────────────┴───────────────────┴───────────────────┘

使用ZSTD压缩压缩率如下表,压缩效果明显优于LZ4:

┌─Column Name───┬─Column Type─┬─compressed─┬─uncompressed─┬─Compression Ratio─┬─compression_codec─┐
│ changeable    │ UInt8       │ 29.05 KiB  │ 41.27 MiB    │           1454.95 │                   │
│ averageSignal │ UInt8       │ 29.05 KiB  │ 41.27 MiB    │           1454.95 │                   │
│ radio         │ Enum8(''    │ 29.08 KiB  │ 41.27 MiB    │           1453.44 │                   │
│ mcc           │ UInt16      │ 62.84 KiB  │ 82.54 MiB    │           1344.98 │                   │
│ net           │ UInt16      │ 80.79 KiB  │ 82.54 MiB    │           1046.21 │                   │
│ unit          │ Int16       │ 1.19 MiB   │ 82.54 MiB    │             69.18 │                   │
│ samples       │ UInt32      │ 31.46 MiB  │ 165.09 MiB   │              5.25 │                   │
│ range         │ UInt32      │ 31.51 MiB  │ 165.09 MiB   │              5.24 │                   │
│ cell          │ UInt64      │ 113.25 MiB │ 330.17 MiB   │              2.92 │                   │
│ created       │ DateTime    │ 70.06 MiB  │ 165.09 MiB   │              2.36 │                   │
│ area          │ UInt16      │ 38.65 MiB  │ 82.54 MiB    │              2.14 │                   │
│ lat           │ Float64     │ 225.17 MiB │ 330.17 MiB   │              1.47 │                   │
│ lon           │ Float64     │ 229.93 MiB │ 330.17 MiB   │              1.44 │                   │
│ updated       │ DateTime    │ 119.08 MiB │ 165.09 MiB   │              1.39 │                   │
└───────────────┴─────────────┴────────────┴──────────────┴───────────────────┴───────────────────┘

列压缩编码

在ClickHouse中,还可以在支持的表引擎中压缩单个列。支持压缩的表引擎如下表所示:

Table EngineColumn CompressionDefault Compression
Merge Tree FamilyYesYes, Change with “compression” settings
Log FamilyYesYes, only LZ4 by default
SetNoYes, only default compression
JoinNoYes, only default compression

可以在创建表语句或修改列中使用CODEC关键字定义列的压缩方法。

CREATE TABLE <database>.<table>
(
    column1 DateTime CODEC(<Codec>),
    .
    .
    .
)
ENGINE = <EngineType>
. . .


--------------------------------

ALTER TABLE <database>.<table> MODIFY COLUMN column1 CODEC(<Codec>);

ClickHouse支持通用目的编码和特定编码,通用编解码器更像默认编解码器(LZ4, ZTSD)及其修改版本。特定编解码器是为了利用数据的特定特征使压缩更有效而设计的。

通用编码

  • NONE : No Compression.
  • LZ4 : Applies LZ4 fast compression.
  • LZ4HC[(level)] : LZ4 HC (high compression) algorithm with configurable level.
  • ZSTD[(level)] : ZSTD compression algorithm with configurable level.

特定编码算法

​ 这些编解码器旨在通过使用数据的特定特征使压缩更有效。有些编解码器本身不压缩数据。相反,它们为通用的编解码器准备数据,编解码器比不准备编解码器更好地压缩数据。

  • Delta : This approach stores the difference between 2 neighbor values. It can be combined with LZ4 and ZSTD.
  • DoubleDelta : This approach stores the difference between 2 neighbor delta values (delta of deltas). Suitable for time series data.
  • Gorilla : Calculates XOR between current and previous value. Suitable for slowly changing floating numbers.
  • T64 : It crops unused high bits of values in integer data types(include Enum, Date, DateTime) and puts them into a 64×64 bit matrix.
  • FPC : Used in floating point values. XOR between the actual value and the predicted value.

我选择不同类型列,对比不同编码的压缩率。首先时ENUM8(radio列的数据类型),共有五个值,统计如下:

┌──count()─┬─radio─┐
│      867 │ NR    │
│   556344 │ CDMA  │
│  9931312 │ GSM   │
│ 12101148 │ LTE   │
│ 20686487 │ UMTS  │
└──────────┴───────┘

不同压缩率对比图如下。显然ZSTD性能好于其他。

在这里插入图片描述

再看看Uint16(area字段类型),该字段基数为57512,压缩率对比图如下:

在这里插入图片描述

最后是Datetime(updated字段类型),该列有1千7百万缓慢变化时间序列数据。使用DoubleDelta和zstd组合性能最好。
在这里插入图片描述

总结

本文主要介绍了ClickHouse的压缩类型及编码方法,并测试数据进行压缩率对比分析。根据分析结果,压缩率不仅和压缩算法和编码相关,也和数据类型,基数,数据特征有关。简单总结如下:

在这里插入图片描述

参考资料:

ClickHouse Compression Algorithms - ClickHouse Performance (chistadata.com)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值