学习科技理念,提升生活品质,追求思想自由之路

0%

常见不同存储类型比较

本文对多种不同类型存储做简单的介绍,重点介绍列式存储与行存储的不同,优缺点,以及如何优化。

行级存储,关系型数据库msql,SqlServer等,重点在于数据的完整性和可靠性,适合传统意义上的OLTP处理操作;

  • 记录存储在表中,表由架构界定,每个字段都有名称和类型,表中每个字段必须遵循表定义
  • 适合小批量的数据计算,用于联机事务处理,事务性较好,
  • 不能满足:对数据库高并发读写要求、对海量数据(上亿)高效存储访问需求、对数据库高可用性和高扩展性要求 – 不适合分布式、高并发和海量

列式存储好处 ,适合大数据量的OLAP操作

  • 数据压缩高,同一类数据分块保存,
  • 紧通过主键rowkey+range来进行查询,不支持join
  • 存储非结构化和半结构化的松散数据

文档存储,如mongodb:

  • 没有强制的架构(scheme)
  • 支持嵌套结构,比如支持Json格式
  • 关心文档的内部结构 ,存储引擎直接支持二级索引,允许对任意字段进行高效查询
异同 行存储 列存储
写文件 一次完成,数据完整性 拆分单列保存,写入次数多,再加上磁盘移动+定位时间
数据修改 在指定位置写入一次 将磁盘定位到多个列上分别写入
读数据 将一行数据完整读出,在内存中排除冗余,数据解析费劲 一列统一格式,数据解析快速

行存储的写入是一次性完成,消耗的时间比列存储少,并且能够保证数据的完整性,缺点是数据读取过程中会产生冗余数据,如果只有少量数据,此影响可以忽略;数量大可能会影响到数据的处理效率。

列存储在写入效率、保证数据完整性上都不如行存储,它的优势是在读取过程,不会产生冗余数据,这对数据完整性要求不高的大数据处理领域,比如互联网,犹为重要。

改进集中在两方面:行存储读取过程中避免产生冗余数据,列存储提高读写效率。

行存储的改进:减少冗余数据首先是用户在定义数据时避免冗余列的产生;其次是优化数据存储记录结构,保证从磁盘读出的数据进入内存后,能够被快速分解,消除冗余列。要知道,目前市场上即使最低端CPU和内存的速度也比机械磁盘快上100-1000倍。如果用上高端的硬件配置,这个处理过程还要更快。

列存储的两点改进:1.在计算机上安装多块硬盘,以多线程并行的方式读写它们。多块硬盘并行工作可以减少磁盘读写竞用,这种方式对提高处理效率优势十分明显。缺点是需要更多的硬盘,这会增加投入成本,在大规模数据处理应用中是不小的数目,运营商需要认真考虑这个问题。2.对写过程中的数据完整性问题,可考虑在写入过程中加入类似关系数据库的“回滚”机制,当某一列发生写入失败时,此前写入的数据全部失效,同时加入散列码校验,进一步保证数据完整性。

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

关于列式存储,可以查看hbase的系统架构文章:http://ixirong.com/2015/07/16/learn-about-hbase/

参考资料
http://blog.csdn.net/dellme99/article/details/16968979
http://www.infoq.com/cn/articles/bigdata-store-choose

以梦为马,不负韶华

Welcome to my other publishing channels