初探列存储数据库

来源:互联网 发布:长沙排名优化软件 编辑:程序博客网 时间:2024/05/01 16:37

本文转载自http://fujohnwang.github.com/blog/2011/12/10/col-store/

要了解列存储数据库的本质,我觉得先从逻辑视角和物理视角来区分一些概念比较好,比如DBMS从逻辑视角来看, 可以分为

  • Relative Database Management System
  • Non-Relative Database Management System

而从物理(存储的)视角来看,则可以分为:

  • Row Based Storage DBMS
  • Column Based Storage DBMS

当然, 无论无论是逻辑视角还是物理视角, 它们都是不冲突的, 比如我们可以将逻辑上的RDBMS和物理上的Row Based Storage DBMS相结合, 那就成为我们平常使用最多的一种数据库产品类型,比如Mysql, Oracle等产品都属于这个范畴, 而如果我们将逻辑上的RDBMS和物理上的Column Based Storage DBMS相结合, 那就成为我们今天要探索的一类数据库产品,即基于列存储的关系型数据库。

RowBasedStore_ColumnBasedStore

上图是摘录自infobright的一份文档, 该图形象的描述了物理上两种不同的存储方式与关系型表之间的关系。可以看到,在通常的基于行存储的RDBMS中, 数据是按照行数据为基础单元进行存储的, 而在基于列存储的DBMS中, 数据则是按照一列一列的数据为单元进行存储, 那么,

  1. 这两种不同的存储方式会造就什么样的差异那?
  2. 为什么通常认为基于行存储的RDBMS更适合OLTP类型的应用场景, 而基于列存储的RDBMS则更适合OLAP类型的应用场景那?

不妨让我们来简单分析一下…

- 基于行存储的RDBMS行为分析

因为数据在这种类型的RDBMS中是按照行存储的,那么数据在写入的时候可以按照一行一行顺序写入,对于磁盘来讲, 这种行为与其物理结构造就的行为是比较契合的。在OLTP类型的应用中, 这种行为是合适的, 虽然基于行的存储在数据读取的时候会存在一定的“缺陷”(很多时候, 并非每一行中每一列的值都需要读取出来),但在OLTP类型的应用中, 通过索引啦之类的机制,可以基本搞定。

所以, 不严谨点儿讲, “基于行存储的RDBMS适合OLTP类型的应用场景”这句话还算恰当。

- 基于列存储的RDBMS行为分析

在基于列存储的RDBMS中, 数据现在是按照一列一列为单元进行存储的,那么要进行一行一行的数据写入的时候, 可能就需要“跳跃式”的将每一行每一列的值写入到不同的区块,显然,对于磁盘结构来说,这中存储方式对数据的写入是不够友好的,性能指定好不到哪儿去(当然,是与基于行存储的DBMS相比)。但是,反过来看, 对数据写入的支持或许不好,那对数据的读取那?很简单就可以看出来,如果我每次都对一列,一列的数据感兴趣,我完全可以快速的读取每一列的所有值,那么, 这种特性对读取的列上所有的值进行统计分析就比较赞了。至于说“基于列存储的RDBMS则更适合OLAP类型的应用场景”, 我们不妨以数据仓库这种特定场景为基础进行一简单的“分析”(CRM之类也可以)。

RowBasedStore_ColumnBasedStore

对于数据仓库来讲, 大部分情况下,它会从各个数据源汇总数据,然后进行分析和反馈, 所谓数据挖掘,商业智能(BI),决策支持之类,大都是数据仓库的职责范围吧!很显然, 要完成这些, 在数据仓库所从事的数据处理操作基本上就是数据的读取占大头儿啦,只有读取之后才能进行分析和统计嘛, 而统计大多也是针对同一指标的数据进行,哎呀, 想到没, 基于列的存储好像很适合哦! Bingo,I Think u got it. 基于列存储的数据库很适合海量的数据查询和统计,也很显然比较适合DW这种部门和相应的应用来使用。

DW会将各个数据源汇总过来的数据做抽取,清洗,转换, 加载之类的工作,然后放入Star Schema或者Snowflake Schema建模的新存储模型中,然后供后端的其它分层和应用使用,此后,大多数操作类型都将是数据读取类型。

- 列存储数据库相关关键技术

  1. Compression
    • 每一列数据从逻辑上来讲其值都归属于同一指标, 很多情况下, 值的离散范围也有一定的规律,如果能干根据这一规律选取合适的压缩算法,显然能够节省很大的存储空间,甚至比原始数据都要小, 大多数列存储数据库都可以达到10:1 到40:1, 50:1不等的压缩率。
    • 列数据库中主要的压缩方法有以下几类:
      1. 消零或空格符法(Null Suppression)
      2. 词典编码算法 (Dictionary Encoding)
      3. 行程编码算法 (Run-length Encoding)
      4. 位向量算法 (Bit-Vector Encoding)
      5. Lempel-Ziv算法 (Lempel-Ziv Encoding)
  2. Late Materialization
    • 这一技术主要式为了解决如何在没有索引的情况下实现最大程度的数据过滤与减少不必要的IO和内存消耗
  3. Block Iteration
  4. Invisible join
  5. column-wise query processing
    • 对提高查询性能十分关键

- 常见列存储数据库

  1. Sybase IQ
    • 商业产品, 感觉是列存储数据库领域举足轻重的一个产品。
  2. Infobright
    • 基于mysql存储的列数据库产品,有开源的社区版和商业的企业版两个版本
    • http://www.infobright.org/ | http://www.infobright.com/
  3. C-Store
    • 开源产品,很多列存储数据库都是以它为原型进行设计和实现的,开山鼻祖?!
  4. 其它, 这里就不罗列的, 没有一一去了解所有的这些产品…

- 参考资料

  1. http://en.wikipedia.org/wiki/Column-oriented_DBMS
  2. http://en.wikipedia.org/wiki/B-tree for Row-Based DB, B+tree index适合差异性很大的一组值
  3. http://en.wikipedia.org/wiki/Bitmap_index for Col-Based DB, bitmap index适合差异性不大的一组值