列式存储和行式存储的理解详解
Posted 发芽ing的小啊呜
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了列式存储和行式存储的理解详解相关的知识,希望对你有一定的参考价值。
列式存储和行式存储的理解详解
叮嘟!这里是小啊呜的学习课程资料整理。好记性不如烂笔头,今天也是努力进步的一天。一起加油进阶吧!
一、列式存储和行式存储
列式存储是指一列中的数据在存储介质中是连续存储的;
行式存储是指一行中的数据在存储介质中是连续存储的。
简单的说,你可以把列式数据库认为是每一列都是一个表,这个表只有一列,如果只在该列进行条件查询,速度就很快。
那这两种不同的存储方式对数据的CRUD有什么不同的影响呢?
看了一些文章,一般说的是下面两点:
1。行数据库适用于读取出少行,多列的情况;
列数据库相反,适用于读取出少数列,多数行的情况。
2。列数据库可以节省空间,如果某一行的某一列没有数据,那在列存储时,就可以不存储该列的值。
二、列式存储和行式存储优比较理解
传统的行式数据库
将一个个完整的数据行存储在数据页中。这种方式在大数据量查询的时候会出现以下问题:
1、在没有索引的情况下,会把一行全部查出来,查询会使用大量IO
2、虽然建立索引和物化视图可以可以快速定位列,但是也需要花费大量时间
但是如果处理查询时需要用到大部分的数据列,这种方式在磁盘IO上是比较高效的。
一般来说,OLTP(Online Transaction Processing,联机事务处理)
应用适合采用这种方式。
一个OLAP类型的查询可能需要访问几百万甚至几十亿个数据行,且该查询往往只关心少数几个数据列。例如,查询今年销量最高的前20个商品,这个查询只关心三个数据列:时间(date)、商品(item)以及销售量(sales amount)。商品的其他数据列,例如商品URL、商品描述、商品所属店铺,等等,对这个查询都是没有意义的。
列式数据库是将同一个数据列的各个值存放在一起。插入某个数据行时,该行的各个数据列的值也会存放到不同的地方。例如上例中列式数据库只需要读取存储着“时间、商品、销量”的数据列,而行式数据库需要读取所有的数据列。因此,列式数据库大大地提高了OLAP大数据量查询的效率
。当然,列式数据库不是万能的,每次读取某个数据行时,需要分别从不同的地方读取各个数据列的值,然后合并在一起形成数据行。因此,如果每次查询涉及的数据量较小或者大部分查询都需要整行的数据,列式数据库并不适用
。
很多列式数据库还支持列组(column group,Bigtable系统中称为locality group)
,即将多个经常一起访问的数据列的各个值存放在一起。如果读取的数据列属于相同的列组,列式数据库可以从相同的地方一次性读取多个数据列的值,避免了多个数据列的合并。列组是一种行列混合存储模式,这种模式能够同时满足OLTP和OLAP的查询需求。
由于同一个数据列的数据重复度很高,因此,列式数据库压缩时有很大的优势。例如,Google Bigtable列式数据库对网页库压缩可以达到15倍以上的压缩率。另外,可以针对列式存储做专门的索引优化。比如,性别列只有两个值,“男”和“女”,可以对这一列建立位图索引:
如上图所示,“男”对应的位图为100101,表示第1、4、6行值为“男”;“女”对应的位图为011010,表示第2、3、5行值为“女”。如果需要查找男性或者女性的个数,只需要统计相应的位图中1出现的次数即可。
另外,建立位图索引后0和1的重复度高,可以采用专门的编码方式对其进行压缩。
三、列式存储优势
基于列模式的存储,天然就会具备以下几个优点:
- 自动索引
因为基于列存储,所以每一列本身就相当于索引。所以在做一些需要索引的操作时,就不需要额外的数据结构来为此列创建合适的索引。
- 利于数据压缩
利于压缩有两个原因。
一来你会发现大部分列数据基数其实是重复的,例如,因为同一个 author 会发表多篇博客,所以 author 列出现的所有值的基数肯定是小于博客数量的,因此在 author 列的存储上其实是不需要存储博客数量这么大的数据量的;
二来相同的列数据类型一致,这样利于数据结构填充的优化和压缩,而且对于数字列这种数据类型可以采取更多有利的算法去压缩存储。
四、小结
列式存储: 每一列单独存放,数据即是索引。
只访问涉及得列,如果我们想访问单独一列(比如NAME)会相当迅捷。
一行数据包含一个列或者多个列,每个列一单独一个cell来存储数据。
行式存储: 把一行数据作为一个整体来存储。
什么时候应该使用行式存储?什么时候应该使用列式存储呢?
简单来讲:
如果你大部分时间都是关注整张表的内容,而不是单独某几列,并且所关注的内容是不需要通过任何聚集运算的,那么推荐使用行式存储
。
列式存储
的话,比如你比较关注的都是某几列的内容,或者有频繁聚集需要的,通过聚集之后进行数据分析的表。
列式存储应用场景
基于一列或比较少的列计算的时候
经常关注一张表某几列而非整表数据的时候
数据表拥有非常多的列的时候
数据表有非常多行数据并且需要聚集运算的时候
数据表列里有非常多的重复数据,有利于高度压缩
行式存储应用场景
关注整张表内容,或者需要经常更新数据
需要经常读取整行数据
不需要聚集运算,或者快速查询需求
数据表本身数据行并不多
数据表的列本身有太多唯一性的数据
Ending!
更多课程知识学习记录随后再来吧!
就酱,嘎啦!
注:
1、人生在勤,不索何获。
2、什么是列存储,一文秒懂参见文章;
https://zhuanlan.zhihu.com/p/127823207
以上是关于列式存储和行式存储的理解详解的主要内容,如果未能解决你的问题,请参考以下文章