写在前面

本文隶属于专栏《100个问题搞定大数据理论体系》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!

本专栏目录结构和文献引用请见100个问题搞定大数据理论体系

解答

行式存储:

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等

关于行存储和列存储的性能对比,笔者认为ClickHouse官网的2张动图最为直观

  1. 行存储
    row-oriented
  2. 列存储
    column-oriented

Q.E.D.


Apache Spark Contributor