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

A. 存储

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

列式存储 索引 列式存储 行式存储_列式存储

列式存储 索引 列式存储 行式存储_列式存储 索引_02

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

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

B.  查询

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

顺序存储,比如我要查询一个时间段里面,某个值的出现频率,我可能只需要涉及到两个列。

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

C. 结语

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

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