写在前面
本文隶属于专栏《100个问题搞定大数据理论体系》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!
本专栏目录结构和文献引用请见100个问题搞定大数据理论体系
解答
行式存储:
1. 数据是按行存储的
2. 没有建立索引的查询将消耗很大的IO
3. 建立索引和视图需要花费一定的物理空间和时间资源
4. 面对大量的查询,复杂的查询数据库必须被大量膨胀才能满足性能需求
列式存储:
1. 数据是按列存储的,每一列单独存放
2. 只访问查询涉及的列大量降低系统IO
3. 数据类型一致,数据特征相似高效的压缩
补充
相比于行式存储,列式存储在分析场景下有着许多优良的特性。
- 分析场景中往往需要读大量行但是少数几个列。在行存模式下,数据按行连续存储,所有列的数据都存储在一个block中,不参与计算的列在IO时也要全部读出,读取操作被严重放大。而列存模式下,只需要读取参与计算的列即可,极大的减低了IO
cost,加速了查询。 - 同一列中的数据属于同一类型,压缩效果显著。列存往往有着高达十倍甚至更高的压缩比,节省了大量的存储空间,降低了存储成本。
- 更高的压缩比意味着更小的 data size,从磁盘中读取相应数据耗时更短。
- 自由的压缩算法选择。不同列的数据具有不同的数据类型,适用的压缩算法也就不尽相同。可以针对不同列类型,选择最合适的压缩算法。
- 高压缩比,意味着同等大小的内存能够存放更多数据,系统cache效果更好。
官方数据显示,通过使用列存,在某些分析场景下,能够获得100倍甚至更高的加速效应。
行列存储优缺点对比
对比方面 | 行存储 | 列存储 |
---|---|---|
写性能 | 写人是一次完成,性能更高 | 把一行记录拆分成单列保存,写入次数明显比行存储多,实际花费时间比行存储多 |
读性能 | 读取少数几列时,需遍历其他无关列,IO开销较大;读取整行数据时,依次顺序读即可,性能高 | 读取少数几列时,无需读取无关列,性能高;读取整行时,需分别读取所有列,并拼装成行,性能低 |
数据压缩 | 每行数据存储在一起,压缩比较低 | 以列为单位存储数据,这使得类型相同的数据存放在一起,对压缩算法友好,压缩比较高 |
典型代表 | Text File、 Sequence File等 | ORC、 Parquet、 Carbon Data等 |
关于行存储和列存储的性能对比,笔者认为ClickHouse官网的2张动图最为直观
- 行存储
- 列存储