列式存储与数据压缩

简介: 列式存储与数据压缩

列式存储数据压缩,对于一款高性能数据库来说是必不可少的特性。一个非常流行的观点认为,如果你想让查询变得更快,最简单且有效的方法是减少数据扫描范围和数据传输时的大小,而列式存储和数据压缩就可以帮助我们实现上述两点。列式存储和数据压缩通常是伴生的,因为一般来说列式存储是数据压缩的前提


按列式存储与按行存储相比,前者可以有效减少查询时所需扫描的数据量,这一点可以用一个示例简单说明。假设一张数据表 A 拥有 50 个字段 A1~A50 ,以及 100 行数据。现在需要查询前 5 个字段并进行数据分析,则可以用如下 SQL 实现:

$ SELECT A1, A2, A3, A4, A5 FROM A;点击复制复制失败已复制


如果数据按行存储,数据库首先会逐行扫描,并获取每行数据的所有 50 个字段,再从每一行数据中返回 A1~A55 个字段。不难发现,尽管只需要前面的 5 个字段,但由于数据是按行进行组织的,实际上还是扫描了所有的字段。如果数据按列存储,就不会发生这样的问题。由于数据按列组织,数据库可以直接获取 A1~A55 列的数据,从而避免了多余的数据扫描。


按列存储相比按行存储的另一个优势是对数据压缩的友好性。同样可以用一个示例简单说明压缩的本质是什么。假设有两个字符串 abcdefghibcdefghi ,现在对他们进行压缩,如下所示:

  • 压缩前:abcdefghi_bcdefghi
  • 压缩后:abcdefghi_(9, 8)


可以看到,压缩的本质是按照一定步长对数据进行匹配扫描,当发现重复部分的时候就进行编码转换。例如上述示例中的 (9, 8) ,表示从下划线开始向前移动 9 个字节,会匹配到 8 个字节长度的重复项,即这里的 bcdefghi


真实的压缩算法自然比这个示例更为复杂,但压缩的实质就是如此。数据中的重复项越多,则压缩率越高;压缩率越高,则数据体量越小;数据体量越小,则数据在网络中传输越快,对网络带宽和磁盘 IO 的压力也就越小。既然如此,那怎样的数据最可能具备重复的特性呢?答案是属于同一列字段的数据,因为他们拥有相同的数据类型和现实语义,重复项的可能性自然就更高。


ClickHouse 就是一款使用列式存储的数据库,数据按列进行组织,属于同一列的数据会被保存在一起,列与列之间也会由不同的文件分别保存(这里主要至 mergeTree 表引擎)。数据默认使用 LZ4 算法压缩,在 Yandex.Metrica 的生产环境中,数据总体的压缩比可以达到 8:1 (未压缩前 17PB ,压缩后 2PB )。列式存储除了降低 IO 和存储的压力之外,还为向量化执行做好了铺垫。

目录
相关文章
|
6月前
|
分布式计算 Hadoop
30 MAPREDUCE数据压缩
30 MAPREDUCE数据压缩
28 0
|
存储 NoSQL 关系型数据库
什么是列式存储,一文秒懂
云栖号资讯:【点击查看更多行业资讯】在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 从数据存储讲起 我们最先接触的数据库系统,大部分都是行存储系统。大学的时候学数据库,老师让我们将数据库想象成一张表格,每条数据记录就是一行数据,每行数据包含若干列。
什么是列式存储,一文秒懂
|
存储 SQL 分布式计算
Parquet与ORC高性能列式存储
Parquet与ORC高性能列式存储
509 0
Parquet与ORC高性能列式存储
|
4月前
|
存储 NoSQL 关系型数据库
你应该知道一些其他存储——列式存储
你应该知道一些其他存储——列式存储
43 2
|
5月前
|
存储 分布式计算 算法
MapReduce【数据压缩】
MapReduce【数据压缩】
|
7月前
|
数据采集 存储 缓存
【如何提高数据采集和分析的性能】如何优化数据查询、数据分区和数据压缩方面的处理
【如何提高数据采集和分析的性能】如何优化数据查询、数据分区和数据压缩方面的处理
|
10月前
|
存储 算法 数据挖掘
行式存储和列式存储的区别
行式存储和列式存储的区别
345 0
Foo
|
存储 编解码 监控