01、概述
02、什么是列存储?
03、数据写入比较
数据读数的比较
06、优缺点
07、列存储的适用场景
最终总结如下
01、概述
目前大数据存储有两种选择:基于行的存储和基于列的存储。
02、什么是列存储?
基于列的存储相对于传统关系数据库基于行的存储。简单来说,两者的区别在于如何组织表格:
基于行的存储将表存储在一系列行中。
基于列的存储将表存储在一系列列中。
从上图可以清楚的看到,行存储下一个表的数据都是放在一起的,但是在列存储下都是分开保存的。所以它们有以下优点和缺点:
03、数据写入比较
1)行存储器的写入一次完成。如果这种写入是基于操作系统的文件系统,则可以保证写入过程的成败,因此可以确定数据的完整性。
2)列存储由于需要将一行记录拆分成单列进行存储,写的次数明显比行存储多(也就是说头调度的次数多,头调度需要时间,一般为1ms~10ms),实际耗时会更大。所以行存储在写的时候有很大的优势。
3)还有数据修改,其实就是一个写的过程。不同之处在于,数据修改会将磁盘上的记录标记为删除。行存储在指定位置写入一次,列存储通过将磁盘定位在多个列上来单独写入,这仍然是行存储的几倍。所以数据修改也是以行存储为主。
数据读数的比较
1)读取数据时,行存储通常会完整地读出一行数据。如果只需要几列数据,就会有冗余列。为了缩短处理时间,消除冗余列的过程通常在内存中进行。
2)列存储中每次读取的数据是集合的一部分或全部,所以不存在冗余问题。
3)两种存储的数据分布。因为存储在列中的每个列的数据类型都是同构的,所以不存在二义性问题。例如,如果列的数据类型是integer (int),则其数据集必须是整数数据。这种情况使得数据分析非常容易。相比之下,行存储要复杂得多,因为一行记录中保存了多种类型的数据,数据分析需要在各种数据类型之间频繁转换,消耗CPU,增加分析时间。所以列存储的解析过程更有利于分析大数据。
4)相比数据压缩和更多的性能读取。
06、优缺点
显然,这两种存储格式各有优缺点:
1)行存储的写入一次完成,比列存储消耗的时间少,可以保证数据的完整性。缺点是数据读取时会产生冗余数据,如果只有少量数据,这种影响可以忽略;数量多了可能会影响数据处理的效率。
2)列存储在写效率和保证数据完整性方面不如行存储。它的优点是在读取过程中不会产生冗余数据,这对于数据完整性要求不高的大数据处理领域尤其重要,比如互联网。
两种存储格式各自的特点决定了它们的使用场景。
07、列存储的适用场景
1)一般来说,一个OLAP查询可能需要访问数百万甚至数十亿个数据行,而查询往往只关心少数几个数据列。例如,要查询今年销售额最高的前20个商品,该查询只关心三个数据列:日期、商品和销售额。商品的其他数据列,如商品URL、商品描述、商品所属的商店等,对这个查询没有意义。
列数据库只需要读取存储“时间、商品和销售”的数据列,而行数据库需要读取所有的数据列。因此,柱状数据库大大提高了OLAP大数据查询的效率。
OLTP在线事务处理器OnLine在线事务处理(如Mysql、Oracle等产品)。
OLAP在线分析处理器在线分析处理系统(如Hive Hbase等。)
2)很多列式数据库还支持列组(Bigtable系统中称为locality group),即将多个频繁访问的数据列的值存储在一起。如果读取的数据列属于同一列族,则列数据库可以一次从同一位置读取多个数据列的值,从而避免多个数据列的合并。列族是行和列的混合存储模式,可以同时满足OLTP和OLAP的查询需求。
3)另外,由于同一数据列的数据重复度高,所以列式数据库在压缩上有很大的优势。
比如Google Bigtable列数据库,可以将网页库压缩15倍以上。此外,您可以对列存储进行特殊的索引优化。例如,性别列只有两个值,“男性”和“女性”,可以为该列建立位图索引:
如下图所示
“男性”对应的位图为100101,表示lines1、4、6的值为“男性”。
“女性”对应的位图为011010,表示行2、3、5的值为“女性”。
如果你需要找到男人或女人的数量,你只需要计算1在相应的位图中出现的次数。另外,位图索引建立后,0和1的重复度高,可以用特殊的编码方法进行压缩。
当然,如果每个查询涉及少量数据或者大多数查询需要一整行数据,列数据库就不适用。
最终总结如下
数据按行存储。
没有索引的查询使用大量的I/O.例如,通用数据库表将被索引以加快查询效率。
建立索引和物化视图需要花费大量的时间和资源。
面对查询需求,数据库必须大幅度扩展才能满足需求。
列数据库的特点如下:
数据按列存储,即每列单独存储。
数据是索引。
只访问查询中涉及的列可以大大减少系统I/O.
每列由一个线程处理,即查询的并发处理性能高。
数据类型一致,数据特征相似,可以高效压缩。比如增量压缩和前缀压缩算法都是基于列存储的类型定制的,所以压缩比可以大大提高,有利于存储和网络输出数据带宽的消耗。
回顾唐子红
标签:数据列存储