数仓知识10:数据库存储的两种方式-行存储和列存储
目前大数据存储主要有两种方案可供选择:行存储(Row-Based)和列存储(Column-Based)。业界对两种方案有许多争持,争论的焦点是:谁能够更有效地处理海量数据,且兼顾安全、可靠、完整性。
0. 前言
目前大数据存储主要有两种方案可供选择:行存储(Row-Based)和列存储(Column-Based)。业界对两种方案有许多争持,争论的焦点是:谁能够更有效地处理海量数据,且兼顾安全、可靠、完整性。从目前发展情况看,关系数据库已经不适应这种巨大的存储量和计算要求,基本是淘汰出局。在已知的几种大数据处理软件中,Hadoop的HBase采用列存储,MongoDB是文档型的行存储,Lexst是二进制型的行存储。
1. 概念介绍
行式存储(Row-basedstorage)常用于传统的关系型数据库。列式存储(column-based)是相对于行式存储说的。
行式存储:按行顺序存储表
列式存储:按列顺序存储表
两种存储的数据都是从上至下,从左向右的排列。行是列的组合,行存储以一行记录为单位,列存储以列数据集合单位,或称列族(column family)。行存储的读写过程是一致的,都是从第一列开始,到最后一列结束。列存储的读取是列数据集中的一段或者全部数据,写入时,一行记录被拆分为多列,每一列数据追加到对应列的末尾处。
2. 对比分析
行存储和列存储的差异主要在数据写入和数据读取上,差别如下:
写入逻辑 (cud增改删) | 读取逻辑 (r 检索查询) | 优势 | 劣势 | 应用场景 | |
---|---|---|---|---|---|
行存储 | 写入是一次完成的,因此写入结果只有成功、失败两种结果 数据修改时,在指定位置写入一次。 | 将一列数据完全读出,如果需要其中几列的数据,就会存在冗余列,出去缩短处理时间的考量,消除冗余列的过程通常是在内存中进行的。 |
|
| 对写入性能、写入完整性要求比较高,但是对查询性能要求不高的场景。 主要是OLTP 操作型数据库。 |
列存储 | 需要把一行记录拆分成单列保存,写入次数明显比行存储多。 数据修改时,将磁盘定位到多个列上分别写入。 | 每次读取的数据是集合的一段或者全部,不存在冗余问题。 |
|
| 对写入性能、写入完整性要求不高,但是对查询性能要求很高的场景。 主要是OLAP 分析型数据库。 |
3. 如何改进
行存储和列存储都有其各自的缺点,假如我们希望能够使用某一种方式,但是又涉及到一些他们劣势方面的场景应用,那么该如何优化。
优化思路:行存储读取过程中避免产生冗余数据,列存储提高写入效率和数据完整性。
- 行存储的改进:减少冗余数据
1、首先是用户在定义数据时避免冗余列的产生;
2、其次是优化数据存储记录结构,保证从磁盘读出的数据进入内存后,能够被快速分解,消除冗余列。
- 列存储的改进:提高写入效率和数据完整性
1、在计算机上安装多块硬盘,以多线程并行的方式读写它们。多块硬盘并行工作可以减少磁盘读写竞用,这种方式对提高处理效率优势十分明显。缺点是需要更多的硬盘,这会增加投入成本,在大规模数据处理应用中是不小的数目。
2、考虑在写入过程中加入类似关系数据库的“回滚”机制,当某一列发生写入失败时,此前写入的数据全部失效,同时加入散列码校验,进一步保证数据完整性。
这两种存储方案还有一个共同改进的地方:频繁的小量的数据写入对磁盘影响很大,更好的解决办法是将数据在内存中暂时保存并整理,达到一定数量后,一次性写入磁盘,这样消耗时间更少一些。目前机械磁盘的写入速度在 20M-50M/ 秒之间,能够以批量的方式写入磁盘,效果也是不错的。
参考资料:
更多推荐
所有评论(0)