列式存储和行式存储有什么区别?

3,877 阅读2分钟

这是我参与8月更文挑战的第20天,活动详情查看:8月更文挑战

行式存储

  1. 数据是按行存储的
  2. 没有建立索引的查询将消耗很大的IO
  3. 建立索引和视图需要花费一定的物理空间和时间资源
  4. 面对大量的查询,复杂的查询数据库必须被大量膨胀才能满足性能需求

列式存储

  1. 数据是按列存储的,每一列单独存放
  2. 只访问查询涉及的列大量降低系统IO
  3. 数据类型一致,数据特征相似高效的压缩

列式存储的优势

  1. 分析场景中往往需要读大量行但是少数几个列。在行存模式下,数据按行连续存储,所有列的数据都存储在一个block中,不参与计算的列在IO时也要全部读出,读取操作被严重放大。而列存模式下,只需要读取参与计算的列即可,极大的减低了IO cost,加速了查询。
  2. 同一列中的数据属于同一类型,压缩效果显著。列存往往有着高达十倍甚至更高的压缩比,节省了大量的存储空间,降低了存储成本。
  3. 更高的压缩比意味着更小的 data size,从磁盘中读取相应数据耗时更短。
  4. 自由的压缩算法选择。不同列的数据具有不同的数据类型,适用的压缩算法也就不尽相同。可以针对不同列类型,选择最合适的压缩算法。
  5. 高压缩比,意味着同等大小的内存能够存放更多数据,系统cache效果更好。

官方数据显示,通过使用列存,在某些分析场景下,能够获得100倍甚至更高的加速效应。

行列存储优缺点对比

对比方面行存储列存储
写性能写人是一次完成,性能更高把一行记录拆分成单列保存,写入次数明显比行存储多,实际花费时间比行存储多
读性能读取少数几列时,需遍历其他无关列,IO开销较大;读取整行数据时,依次顺序读即可,性能高读取少数几列时,无需读取无关列,性能高;读取整行时,需分别读取所有列,并拼装成行,性能低
数据压缩每行数据存储在一起,压缩比较低以列为单位存储数据,这使得类型相同的数据存放在一起,对压缩算法友好,压缩比较高
典型代表Text File、 Sequence File等ORC、 Parquet、 Carbon Data等

行存储和列存储的性能对比

  1. 行存储

1.gif

  1. 列存储

2.gif

图片来自 ClickHouse 官网,关于 ClickHouse 请参考我的博客——ClickHouse 是什么?ClickHouse 有哪些特性?