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

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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ClickHouse是一个开源的列式数据库管理系统,用于处理大规模数据分析和实时查询。在进行ClickHouse性能测试时,可以通过创建表和插入数据来模拟真实的数据场景。引用\[1\]和\[2\]提供了创建表的示例代码,可以根据需要进行修改和扩展。 性能测试的一个常见指标是查询响应时间。可以使用SELECT语句来执行各种查询,并记录查询的执行时间。引用\[3\]提供了一个示例查询,计算了两个日期的bitmapCardinality,并计算了两个结果的差值。可以根据具体需求编写更复杂的查询语句,并使用ClickHouse提供的各种聚合函数和条件筛选来测试性能。 在进行性能测试时,还可以考虑以下几个方面: - 数据量:可以根据实际情况生成不同规模的测试数据,以模拟真实的数据场景。 - 并发性:可以同时执行多个查询,并观察系统的响应时间和资源利用率。 - 硬件配置:性能测试的结果可能会受到硬件配置的影响,可以在不同的硬件环境下进行测试,以评估系统的扩展性和性能表现。 总之,ClickHouse性能测试可以通过创建表、插入数据和执行查询来评估系统的性能和吞吐量。可以根据具体需求设计测试方案,并根据测试结果进行性能优化和调整。 #### 引用[.reference_title] - *1* *2* *3* [Clickhouse性能测试](https://blog.csdn.net/sileiH/article/details/111183622)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值