列式存储

Redshift是列式存储(Columnar File System),本节我们来介绍这种类型的存储

行存储系统以行的方式来组织数据。它利于数据一行一行的写入,写入一条数据记录时,只需要将数据追加到已有数据记录后面即可。行模式存储适合 OLTP(Online Transaction Processing)系统,因为数据基于行存储,所以数据的写入会更快,对按记录查询数据也更简单。

image-20221025072106577

让我们想象一种场景,现在不是想查询某一条记录,我想统计 Bob 发表的博客数,或是整个系统今天的博客点赞数。如果是行存储系统,数据库将怎样操作?想统计所有点赞数,首先需要将所有行数据读入内存,然后对 like_num 列做 sum 操作,从而得到结果。

这种经常需要通过大量数据集来聚合统计数据的需求其实是 OLAP 系统的常见行为。基于这个需求我们也可以明白为什么列式存储开始流行。因为数据,大数据,数据分析,也就是 OLAP(Online Analytical Processing)在线分析系统的需求增多了,数据写入的事务和按记录查询数据都不是它的关注点它关注的是数据过滤,统计

但任何的选择和倾向都是有代价的,要么空间换时间,要么时间换空间。选择列式存储必然也有不利的一面。首先就表现在数据写入上。当一条新数据到来,需要将每一列存储到对应的位置。这样就需要多次写磁盘操作。(对于多次写操作的问题,大部分存储系统会通过缓冲来降低这种情况带来的不足)

列存储优势

基于列模式的存储,天然就会具备以下几个优点:

  • 自动索引——因为基于列存储,所以每一列本身就相当于索引。所以在做一些需要索引的操作时,就不需要额外的数据结构来为此列创建合适的索引。

  • 利于数据压缩——利于压缩有两个原因。一来你会发现大部分列数据基数其实是重复的,例如同一个 author 会发表多篇博客,所以 author 列出现的所有值的基数肯定是小于博客数量的,因此在 author 列的存储上其实是不需要存储博客数量这么大的数据量的;二来相同的列数据类型一致,这样利于数据结构填充的优化和压缩,而且对于数字列这种数据类型可以采取更多有利的算法去压缩存储。