以前不是特别明白列式存储和行式存储到底有什么区别,对于突然蹦出来的BigTable、HBase、Cassandra这些NoSQL数据库凭什么比MySQL集群,Oracle在分析存储上的强大?思来可以这样说说。

A. 存储

传统RDBMS以行单位做数据存储(字段为空则赋值为‘NULL’),列式存储数据库以列为单位做数据存储。如下:

%title插图%num

%title插图%num

对于列式存储来说,一行数据包含一个列或者多个列,每个列一单独一个cell来存储数据。而行式存储,则是把一行数据作为一个整体来存储。

另外一个不得不提的是,列式存储天生就是适合压缩,因为同一列里面的数据类型基本是相同,笔者在之前使用普通的gzip压缩,200MB的字符串数据,经过压缩之后只剩下8MB。当然gzip并不属于增量压缩,我们可以选择增量压缩的方式来满足一些数据的随机查找。

B.  查询

从查询来说,行式存储比较适合随机查询,并且RDBMS大多提供二级索引,在整行数据的读取上,要优于列式存储。但是,行式存储不适合扫描,这意味着要查询一个范围的数据,行式存储需要扫描整个表(因为这些记录不是顺序存储的),在索引建立不当的情况下,查询大表(千万数据)简直是噩梦。

列式存储,*早接触的可能不是所谓的BigTable,大多数以前的数据仓库都是采用列式存储。列式存储一般行KEY,列KEY(不是列值)都是顺序存储,比如我要查询一个时间段里面,某个值的出现频率,我可能只需要涉及到两个列。

在分析上,列式存储要优于行式存储,列式存储的数据库一般情况下也强烈建议用户按需查找,而不是整行数据去获取。列式存储在这方面减少了IO的压力。

C. 结语

没有说谁比谁更优,在正真实战的情况,考虑实际情况。比如传统的RDBMS提供ACID原子操作和事务,在大多数列式存储数据库上是不具备的,大多数列式存储数据库对分布式支持友好。

需要知道的是,列式存储以及行式存储在查询和存储上的本质,在技术选型上多点筹码。

什么是列式数据库?列式数据库是以列相关存储架构进行数据存储的数据库。卢东明认为数据库发展已经到了一个新阶段,数据库市场需要细分,行式数据库不再满足所有的需求,而有很多需求需要通过内存数据库和列式数据库解决,列式数据库在数据分析、海量存储、BI这三个领域有自己独到。

5 年内可能会发生以下变化:

大多数数据仓库将以列模式存储

大多数 OLTP 数据库将可能是内存数据库 (IMDB),或完全驻留在内存内

大多数大型数据库服务器将通过集群方式进行横向扩展

很多数据收集和报告问题将由没有任何形式图式的数据库解决。

传统的行式数据库,是按照行存储的,维护大量的索引和物化视图无论是在时间(处理)还是空间(存储)方面成本都很高。而列式数据库恰恰相反,列式数据库的数据是按照列存储,每一列单独存放,数据即是索引。只访问查询涉及的列,大大降低了系统I/O,每一列由一个线来处理,而且由于数据类型一致,数据特征相似,*大方便压缩。

*后卢东明很务实的指出,没有万能的数据库,Sybase IQ也并非万能,只不过给DBA们的工具箱里提供更多的选择,DBA需根据自己的应用场景自行选择。

在数据仓库领域,列式数据库和传统的行式数据库有何差别呢?列式数据库和行式数据库的拥护者均认为结合这两种技术的混合数据库是个不错的想法。

行式数据库擅长随机读操作,列式数据库则更擅长大批量数据量查询,而混合数据库则试图同时包含这两种技术的优点,在灾难恢复环境中,数据要么按列式存储,要么按行式存储。

我认为未来将是列式数据库的天下,行数据库和混合型数据库都将渐渐消亡,原因如下:数据增长速度很快,对存储设备(主内存和SSD)的需求也将不断上升,随着主内存和SSD中压缩列所占百分比的提高,列式数据库随机读的弱点反而变成了优点,这样列式数据库不管是应付联机事务处理,还是大批量更新或大型报表需要执行的复杂查询都能应付自如。对于更新操作而言,列式数据库和行式数据库在这方面已经没有多大差距了,因为大部分更新操作只会影响到一行中的一到三列(字段),同时,大部分更新操作影响的是*近的数据,因此主内存/SSD缓存中数据会越来越多。对于插入和删除操作而言,先在内存中快速更新索引,然后再写入磁盘,这意味着在I/O密集型情况下也不会有明显的性能下降。对在线备份而言,按列存储方法压缩数据后备份时间窗口将会更短。

对今天的数据仓库而言,列式数据库的性能和传统行数据库相比,根本不在一个数量级上,列式数据库已经得到了广泛的认可和使用(Sybase IQ已经有十年历史,也出现了一些新兴列式数据库公司,如Vertica),数据库巨人Oracle也按捺不住,在其Exadata数据库机中也加入了按列存储选择,IBM则提供了一个列式专用设备,它可以确定什么数据该按列存储,什么数据该按行存储,然后将事务分流到相应的设备。

列式数据库

维基百科,自由的百科全书

列式数据库是以列相关存储架构进行数据存储的数据库,主要适合与批量数据处理和即席查询。相对应的是行式数据库,数据以行相关的存储体系架构进行空间分配,主要适合与小批量的数据处理,常用于联机事务型数据处理。

[编辑]描述

数据库以行、列的二维表的形式存储数据,但是却以一维字符串的方式存储,例如以下的一个表:

EmpId Lastname Firstname Salary
1 Smith Joe 40000
2 Jones Mary 50000
3 Johnson Cathy 44000

这个简单的表包括员工代码(EmpId), 姓名字段(Lastname and Firstname)及工资(Salary).

这个表存储在电脑的内存(RAM)和存储(硬盘)中。虽然内存和硬盘在机制上不同,电脑的操作系统是以同样的方式存储的。数据库必须把这个二维表存储在一系列一维的“字节”中,又操作系统写到内存或硬盘中。

行式数据库把一行中的数据值串在一起存储起来,然后再存储下一行的数据,以此类推。

1,Smith,Joe,40000;2,Jones,Mary,50000;3,Johnson,Cathy,44000;

列式数据库把一列中的数据值串在一起存储起来,然后再存储下一列的数据,以此类推。

1,2,3;Smith,Jones,Johnson;Joe,Mary,Cathy;40000,50000,44000;

这是一个简化的说法。

列式数据库的代表包括:Sybase IQParAccelSand/DNA Analytics和 Vertica

Sybase IQ: 知道IQ跟其它的关系型数据库相比,它的主要特征是什么?包括查询快、数据压缩比高、Load快,但是插入更新慢,不太适合数据老是变化,它是按列存储的。这时候你就知道它适做DSS(决策支持系统),数据集市,数据仓库,它不适合OLTP。适合OLAP 。

列式数据库的优点:
数据压缩比高,正因为同一类型的列存储在一起。
简化数据建模的复杂性。
由于查询需要读取的blocks少,速度更快。
BI的优秀选择。