随着数据库数据越来越多,给数据存储、网络访问造成成本和负担。压缩技术节约存储空间、加速网络访问的常用解决方案,本文主要介绍压缩算法和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 Name | Compressed Table Size(GB) | Uncompressed Table Size(GB) | Compression Ratio |
---|---|---|---|
cell_towers_LZ4 | 1,07 | 2,06 | 1,92 |
cell_towers_zstd | 0,84 | 2,06 | 2,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 Engine | Column Compression | Default Compression |
---|---|---|
Merge Tree Family | Yes | Yes, Change with “compression” settings |
Log Family | Yes | Yes, only LZ4 by default |
Set | No | Yes, only default compression |
Join | No | Yes, 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的压缩类型及编码方法,并测试数据进行压缩率对比分析。根据分析结果,压缩率不仅和压缩算法和编码相关,也和数据类型,基数,数据特征有关。简单总结如下:
参考资料:文章来源:https://www.toymoban.com/news/detail-466150.html
ClickHouse Compression Algorithms - ClickHouse Performance (chistadata.com)文章来源地址https://www.toymoban.com/news/detail-466150.html
到了这里,关于ClickHouse性能调优——压缩和编码算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!