zoukankan      html  css  js  c++  java
  • 列式数据库与行式数据库分析

    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/

  • 相关阅读:
    Elasticsearch学习之深入搜索三 --- best fields策略
    Elasticsearch学习之深入搜索二 --- 搜索底层原理剖析
    Elasticsearch学习之深入搜索一 --- 提高查询的精准度
    Elasticsearch学习之深入聚合分析五---案例实战
    Enigma Virtual Box:生成可执行文件。
    erlang的erl文件的编码方式
    Java相关术语 或者 组件命。
    pyqt5加载网路图片,不本地下载。
    Python3 的json 和 PHP的json
    python3 post方式上传文件。
  • 原文地址:https://www.cnblogs.com/rrttp/p/7426771.html
Copyright © 2011-2022 走看看