真实给同一列连续整数分别用LZ4、ZSTD、Delta+LZ4、NONE编码存一份,对比真实压缩后的字节数差距。
代码CREATE TABLE demo.codec1 ( k UInt64, v_default UInt64 CODEC(LZ4), v_zstd UInt64 CODEC(ZSTD(3)), v_delta UInt64 CODEC(Delta, LZ4), v_none UInt64 CODEC(NONE) ) ENGINE=MergeTree ORDER BY k; INSERT INTO demo.codec1 SELECT number, number, number, number, number FROM numbers(2000000);
SELECT column, data_compressed_bytes, data_uncompressed_bytes, round(data_compressed_bytes/data_uncompressed_bytes,4) AS ratio FROM system.columns WHERE table='codec1'; column compressed uncompressed ratio v_none 16006125 16000000 1.0004 ← 不压缩,反而比原始略大(块头开销) v_default 8009940 16000000 0.5006 ← LZ4默认,只压掉一半 v_zstd 2052891 16000000 0.1283 ← ZSTD(3),压到12.8% v_delta 80324 16000000 0.0050 ← Delta+LZ4,真实压到0.5%
同一列数据,从不压缩(16MB)到Delta+LZ4(80KB),真实相差约200倍;即便是同为通用压缩算法的LZ4和ZSTD相比,ZSTD(3)也真实比LZ4默认压缩比高出近4倍——但两者都远远比不上专门为这份数据形状设计的Delta编码。
每一步都是本文上面用真实system.columns跑出来的原始压缩字节数。
system.columns(data_compressed_bytes列)CODEC(NONE/LZ4/ZSTD(3)/Delta,LZ4) 四种编码