存储层存储字符串/二进制批数据为何采用长度而非偏移量编码?
变长数据存储:长度比偏移量压缩率高的原因
本质逻辑:数据特性决定压缩效率
采用长度存储而非偏移量,压缩率更高的核心是长度值的数据分布更适合压缩算法发挥作用,不是只有特定算法才有效,但不同算法的收益差别不小:
冗余度差异:偏移量是累加生成的,比如第一个数据偏移0,第二个是第一个的长度,第三个是前两个长度之和,数值持续递增,相邻值的差值才是当前字段长度,但偏移量本身几乎无重复规律;而长度值是每个字段的独立长度,OLAP场景里同列数据的长度往往高度相似(比如存储商品标题,大多集中在10-20字),重复或接近的数值更多,压缩算法能轻松识别冗余进行压缩。
不同压缩算法的表现:
- 像LZ4、zstd这类依赖字典和重复序列的算法,长度值的重复模式极易被捕捉,能生成更短的字典映射;偏移量的递增特性导致几乎无重复序列,压缩效率极低。
- Snappy、LZO这类统计型压缩算法,长度值集中在特定区间,高频数值能用更少的比特位存储;偏移量分布过于发散,统计压缩的收益基本可以忽略。
- 几乎所有通用压缩算法都能从长度存储中获益,只是收益程度不同——越依赖重复模式或统计分布的算法,两者的压缩率差异越明显。
OLAP列存的放大效果
OLAP数据库(如ClickHouse)和Parquet这类列存格式,本身按列聚合数据,同列的长度值天然聚集在一起,进一步放大了长度值的分布相似性,让压缩算法的优化效果更显著;而如果存储偏移量,整列数值持续递增,熵值极高,压缩难度极大。

内容的提问来源于stack exchange,提问作者Hsu Jason
相关产品推荐
相关产品推荐

