0. 前言

目前大数据存储主要有两种方案可供选择:行存储(Row-Based)和列存储(Column-Based)。业界对两种方案有许多争持,争论的焦点是:谁能够更有效地处理海量数据,且兼顾安全、可靠、完整性。从目前发展情况看,关系数据库已经不适应这种巨大的存储量和计算要求,基本是淘汰出局。在已知的几种大数据处理软件中,Hadoop的HBase采用列存储,MongoDB是文档型的行存储,Lexst是二进制型的行存储

1. 概念介绍

行式存储(Row-basedstorage)常用于传统的关系型数据库。列式存储(column-based)是相对于行式存储说的。

行式存储:按行顺序存储

列式存储:按列顺序存储

两种存储的数据都是从上至下,从左向右的排列。行是列的组合,行存储以一行记录为单位,列存储以列数据集合单位,或称列族(column family)。行存储的读写过程是一致的,都是从第一列开始,到最后一列结束。列存储的读取是列数据集中的一段或者全部数据,写入时,一行记录被拆分为多列,每一列数据追加到对应列的末尾处。

2. 对比分析

行存储和列存储的差异主要在数据写入和数据读取上,差别如下:

写入逻辑

(cud增改删)

读取逻辑

(r 检索查询)

优势劣势应用场景
存储

写入是一次完成的,因此写入结果只有成功、失败两种结果

数据修改时,在指定位置写入一次。

将一列数据完全读出,如果需要其中几列的数据,就会存在冗余列,出去缩短处理时间的考量,消除冗余列的过程通常是在内存中进行的。

  1. 写入时可以保证数据的完整性;
  2. 写入时的性能比列存储高,消耗时间更少。
  1. 数据读取过程中会产生冗余数据;
  2. 数据解析比较复杂,因为每一行记录中保存了多种类型的数据,数据解析需要在多种数据类型之间频繁转换,很消耗CPU。

对写入性能、写入完整性要求比较高,但是对查询性能要求不高的场景。

主要是OLTP 操作型数据库。

存储

需要把一行记录拆分成单列保存,写入次数明显比行存储多。

数据修改时,将磁盘定位到多个列上分别写入。

每次读取的数据是集合的一段或者全部,不存在冗余问题。

  1. 数据读取过程不会产生冗余数据;
  2. 数据解析会比较容易,每一列数据类型是同质的,不存在二义性问题,比如某列数据是整型(int),那么它的数据集合一定是整型;
  3. 存储的数据,压缩时有很大的优势,主要是同一个数据列的数据重复度比较高。
  1. 写入时不能完全保证数据的完整性;
  2. 写入时的性能比列存储低。

对写入性能、写入完整性要求不高,但是对查询性能要求很高的场景。

主要是OLAP 分析型数据库。

3. 如何改进

行存储和列存储都有其各自的缺点,假如我们希望能够使用某一种方式,但是又涉及到一些他们劣势方面的场景应用,那么该如何优化。

优化思路:行存储读取过程中避免产生冗余数据,列存储提高写入效率和数据完整性。

  • 存储的改进:减少冗余数据

1、首先是用户在定义数据时避免冗余列的产生;

2、其次是优化数据存储记录结构,保证从磁盘读出的数据进入内存后,能够被快速分解,消除冗余列。

  • 存储的改进:提高写入效率和数据完整性

1、在计算机上安装多块硬盘,以多线程并行的方式读写它们。多块硬盘并行工作可以减少磁盘读写竞用,这种方式对提高处理效率优势十分明显。缺点是需要更多的硬盘,这会增加投入成本,在大规模数据处理应用中是不小的数目。

2、考虑在写入过程中加入类似关系数据库的“回滚”机制,当某一列发生写入失败时,此前写入的数据全部失效,同时加入散列码校验,进一步保证数据完整性。

这两种存储方案还有一个共同改进的地方:频繁的小量的数据写入对磁盘影响很大,更好的解决办法是将数据在内存中暂时保存并整理,达到一定数量后,一次性写入磁盘,这样消耗时间更少一些。目前机械磁盘的写入速度在 20M-50M/ 秒之间,能够以批量的方式写入磁盘,效果也是不错的。

参考资料:

行存储 VS 列存储

大数据存取的选择:行存储还是列存储

 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐