列式数据库与行式数据库分析

1,行式数据库

定义:存储格式按照‘行’的方式把一行各个字段的数据存储在一起,一行行连续存储。

图 1

把一条数据的信息写到数据库中;或者对一条数据中的某些字段进行修改;或者删除整条数据一类的OLTP操作来说既直观也高效。

但是,在行式数据库上做一些报表、分析的时候,大家又发现这种存储格式使用效率不高。例如:统计各省份的销售额和利润同比变化;按照部门统计业绩完成情况等等,都是在其中某些字段上的操作,行式数据库不分情况一律按照页面读取数据的方式,在只分析销售额和利润的时候,把每一份合同的其他信息,如客户名称,签约时间,客户经理等等也统统都读了进来,浪费了大量宝贵的I/O。

数据库界给出的第一个改进办法就是“索引”,就像字典前面的目录一样,做到快速定位。但是随着分析场景变得越来越复杂、变化越来越多,DBA们发现索引通常只能为一部分查询、分析起到帮助的作用,如果想为一个企业级的BI系统中所有的查询、分析场景做优化,无论是从组合的角度,还是从开销的角度,都几乎是不可能的,因为大量的索引所带来的存储空间的浪费以及为维护这些索引所带来的时间的浪费都会以指数级别增长。

2,列式数据库

定义:列式数据库是将同一个数据列的各个值存放在一起。插入某个数据行时,该行的各个数据列的值也会存放到不同的地方。上例中列式数据库只需要读取存储着“客户名称,签约时间,客户经理”的数据列,而行式数据库需要读取所有的数据列。因此,列式数据库大大地提高了OLAP大数据量查询的效率。当然,列式数据库不是万能的,每次读取某个数据行时,需要分别从不同的地方读取各个数据列的值,然后合并在一起形成数据行。因此,如果每次查询涉及的数据量较小或者大部分查询都需要整行的数据,列式数据库并不适用。

图 2

很多列式数据库还支持列组(column group,Bigtable系统中称为locality group),即将多个经常一起访问的数据列的各个值存放在一起。如果读取的数据列属于相同的列组,列式数据库可以从相同的地方一次性读取多个数据列的值,避免了多个数据列的合并。列组是一种行列混合存储模式,这种模式能够同时满足OLTP和OLAP的查询需求。由于同一个数据列的数据重复度很高,因此,列式数据库压缩时有很大的优势。例如,Google Bigtable列式数据库对网页库压缩可以达到15倍以上的压缩率。另外,可以针对列式存储做专门的索引优化。比如,性别列只有两个值,“男”和“女”,可以对这一列建立位图索引:

如图3所示,“男”对应的位图为100101,表示第1、4、6行值为“男”;“女”对应的位图为011010,表示第2、3、5行值为“女”。如果需要查找男性或者女性的个数,只需要统计相应的位图中1出现的次数即可。另外,建立位图索引后0和1的重复度高,可以采用专门的编码方式对其进行压缩。

图3

3,行式数据库与列式数据库的区别

http://fifiole.blog.163.com/blog/static/169459225201111610351428/

参考文献:

http://book.2cto.com/201309/32718.html

http://fifiole.blog.163.com/blog/static/169459225201111610351428/

时间: 2024-07-31 14:21:33

列式数据库与行式数据库分析的相关文章

数据库为什么会分为“行式存储”和“列式存储”呢?

我们知道 当今的数据处理大致可分为两大类 联机事务处理 OLTP (on-line transaction processing) 以及联机分析处理 OLAP (On-Line Analytical Processing) OLTP 是传统关系型数据库的主要应用 用来执行一些基本的.日常的事务处理 比如数据库记录的增.删.改.查等等 而 OLAP 则是分布式数据库的主要应用 它对实时性要求不高,但处理的数据量大 通常应用于复杂的动态报表系统上 OLTP与OLAP的主要区别 OLTP与OLAP 在

什么是行式数据库,什么是列式数据库

数据库以行.列的二维表的形式存储数据.可是却以一维字符串的方式存储.比例如以下面的一个表: EmpId Lastname Firstname Salary 1 Smith Joe 40000 2 Jones Mary 50000 3 Johnson Cathy 44000 这个简单的表包含员工代码(EmpId), 姓名字段(Lastname and Firstname)及工资(Salary). 这个表存储在电脑的内存(RAM)和存储(硬盘)中.尽管内存和硬盘在机制上不同,电脑的操作系统是以相同的

一:MySQL数据库的性能的影响分析及其优化

MySQL数据库的性能的影响分析及其优化 MySQL数据库的性能的影响 一. 服务器的硬件的限制 二. 服务器所使用的操作系统 三. 服务器的所配置的参数设置不同 四. 数据库存储引擎的选择 五. 数据库的参数配置的不同 六. (重点)数据库的结构的设计和SQL语句 1). 服务器的配置和设置(cpu和可用的内存的大小) 1.网络和I/O资源 2.cpu的主频和核心的数量的选择 (对于密集型的应用应该优先考虑主频高的cpu) (对于并发量大的应用优先考虑的多核的cpu) 3.磁盘的配置和选择 (

NoSQL数据库的四大分类及分析

 NoSQL(NoSQL = Not Only SQL ),意即"不仅仅是SQL",是一项全新的数据库革命性运动,早期就有人提出,发展至2009年趋势越发高涨.NoSQL的拥护者们提倡运用非关系型的数据存储,相对于铺天盖地的关系型数据库运用,这一概念无疑是一种全新的思维的注入. NoSQL数据库分四大类: 键值(Key-Value)存储数据库 这一类数据库主要会使用到一个哈希表,这个表中有一个特定的键和一个指针指向特定的数据.Key/value模型对于IT系统来说的优势在于简单.易

数据库中间件 Sharding-JDBC 源码分析 —— SQL 解析(三)之查询SQL

关注微信公众号:[芋艿的后端小屋]有福利: RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表 RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址 您对于源码的疑问每条留言都将得到认真回复.甚至不知道如何读源码也可以请教噢. 新的源码解析文章实时收到通知.每周更新一篇左右. 认真的源码交流微信群. 如果代码排版翻车了,请点击原文链接:http://www.yunai.me/Sharding-JDBC/sql-pa

Akka(41): Http:DBTable-rows streaming - 数据库表行交换

在前面一篇讨论里我们介绍了通过http进行文件的交换.因为文件内容是以一堆bytes来表示的,而http消息的数据部分也是byte类型的,所以我们可以直接用Source[ByteString,_]来读取文件然后放进HttpEntity中.我们还提到:如果需要进行数据库数据交换的话,可以用Source[ROW,_]来表示库表行,但首先必须进行ROW -> ByteString的转换.在上期讨论我们提到过这种转换其实是ROW->Json->ByteString或者反方向的转换,在Akka-h

如何对行 表 数据库加锁

如何对行 表 数据库加锁 android 多线程数据库读写分析与优化 (转)SQLite的事务和锁 SQLite多线程下的并发操作

高并发场景下缓存+数据库双写不一致问题分析与解决方案设计

Redis是企业级系统高并发.高可用架构中非常重要的一个环节.Redis主要解决了关系型数据库并发量低的问题,有助于缓解关系型数据库在高并发场景下的压力,提高系统的吞吐量(具体Redis是如何提高系统的性能.吞吐量,后面会专门讲). 而我们在Redis的实际使用过程中,难免会遇到缓存与数据库双写时数据不一致的问题,这也是我们必须要考虑的问题.如果还有同学不了解这个问题,可以搬小板凳来听听啦. 一.数据库+缓存双写不一致问题引入 要讲数据库+缓存双写不一致的问题,就需要先讲一下这个问题是怎么发生的

MySQL用命令行导出数据库

MySQL命令行导出数据库:首先进入cmd然后:1. cd C:\Program Files (x86)\MySQL\MySQL Server 5.1\bin2. mysqldump -uroot -p labos1502 > labos1502.sql3. 提示输入密码时,输入该数据库用户名的密码(如果导出单张表的话在数据库名后面输入表名即可)如果提示locktable错误:则在mysqldump -uroot -p abc后面空一格加上--skip-lock-tables4. 会看到文件la