列存储解惑

原文:http://www.penglixun.com/tech/database/column-oriented_dbms_analyse.htmlhtml

这些天看数据仓库的内容,发现一个新内容——列式存储。曾经有想过把数据库行列转置做成索引,不过没有深想,没想到列式数据库已经开始发展起来了。
首先看下WIKI上对列式数据库的解释:
web

列式数据库是以列相关存储架构进行数据存储的数据库,主要适合与批量数据处理和即席查询。相对应的是行式数据库,数据以行相关的存储体系架构进行空间分配,主要适合与小批量的数据处理,经常使用于联机事务型数据处理。
数据库以行、列的二维表的形式存储数据,可是却以一维字符串的方式存储,例如如下的一个表:
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;
这是一个简化的说法。数据库

昨天装了下两个基于MySQL的数据仓库,infindb和infobright,看了文档发现它们都是列式数据库,把40多M的数据导入infobright,没想到数据文件只有1M多,压缩比令我惊讶!
而后测试了下选择某一列,在列上作计算,都比MyISAM和InnoDB要快,看了一些原理文档,就本身模拟了一下,写了个程序测试。
从内存中读取效率很高,可是从磁盘中读取(假设行式数据库的索引在内存中)比行式数据库要慢(开始在Twitter上说比行式快是程序写错了),不过我以为仍是我设计上的问题,至少Infobright就比MyISAM/InnoDB快,列式应该也有其特殊的索引机制和缓存机制,例如每列分开存在不一样的文件,这样文件指针转移会更快。
2010-02-04补充:采用了多个文件指针后,列式存储明显加速,若是给每一个列一个文件指针,效率会很是高,也能够确定,若是每一个列单独存储一个文件,效率还会提升。如今文件中列式表读取效率下降了4/5,接近行式表了。继续优化还能提升。缓存

相关文章
相关标签/搜索