zoukankan      html  css  js  c++  java
  • 转:关于数据库压缩技术的Survey

    原文来自于:http://outofmemory.cn/mysql/database-compression-tech

    昨天给团队内的小伙伴做了一个关于数据库压缩技术的Survey,现将其中可以公开的部分分享出来。数据库压缩技术目前已经成为了各种数据库的标配技术,这里面包括三大商业数据库、各种专业的分新型数据库,也包括各种开源数据库和NoSQL数据库。

    到了今天,数据库压缩技术的运用已经不单纯是为了节省存储成本,更多的时候,是为了提供更高的计算密度(比如容量受限的SSD),以及提供更高的查询性能(OLAP)。对于压缩的有利因素,一些公共的认知是:列比行更有利于压缩,更大的输入、有序的输入更有利于压缩。

    不同数据库对于压缩粒度的选择也千差万别,大多数数据库使用块作为压缩的基本单位,少数数据库会提供字段级的压缩,但也有一些数据库使用表、甚至整个库作为压缩的基本单位。很明显,压缩粒度越粗,对系统的可用性影响越大,表级以上的压缩粒度通常不再被认为是数据库本身支持了压缩技术。

    除了压缩粒度之外,存储格式的选择对应用场景也比较重要,比如行存适合于宽查询(访问少数行和多数列),面向投影优化(OLTP);而列存适合于窄查询(访问多数行和少数列),面向Filter优化(OLAP);两者的混合体是所谓的块内按列压缩,块间按行组织,即行列混合存储(PAX),典型的代表是ORACLE EXADATA的HCC。

    虽然是一种标配,但不同数据库对于数据库压缩技术的实现几乎各不相同,但总体上可以分为三个层次:1)Packing,比如消除小整数的前端0,消除CHAR的尾部空格等,这类压缩技术通常发生在OLTP系统中,粒度通常为字段级别,系统通常会提供正常和紧缩的两种存储格式;2)Encoding,也就是规则压缩,典型的方法包括字典、RLE、前缀、差值等,相关技术的细节,在参考资料里有详细的论述;3)Compression,也就是后端压缩,即直接使用通用的压缩算法,比如Snappy、Zlib、BZip等。

    所有商业数据库和专业的分析型数据库都会引入不同的Encoding方法,而不会直接使用Compression。道理很简单,首先,Encode比Compression更懂数据,因为Compression总是把数据看成连续的字节流,而Encoding知道每个字段的边界、类型和值域特征,所以Encoding+Compression会比仅使用Compression能提供更高的压缩率;第二,Encoding会提供更高的解码速度,因为哪怕是最快的Snappy,也需要把数据完全解压后才可查询,而大多数Encoding方法不需要解码即可查询;最后,Encoding会提供合理的编码速度,虽然比不过Snappy,但会远超Zlib、Bzip这样的对手。

    下面给出一个数据库压缩技术的Survey:

    以下给出一些数据库压缩技术有用的链接:

  • 相关阅读:
    [转] 你不知道的JavaScript和CSS交互的方法
    threejs学习笔记(9)
    把Mongodb配置成windows服务
    mongodb的一些基本操作
    DuiLib事件分析(一)——鼠标事件响应
    DuiLib学习bug整理——某些png不能显示
    DuiLib学习笔记5——标题栏不能正常隐藏问题
    DuiLib学习笔记4——布局
    DuiLib学习笔记3——颜色探究
    DuiLib学习笔记2——写一个简单的程序
  • 原文地址:https://www.cnblogs.com/guoyongrong/p/4261587.html
Copyright © 2011-2022 走看看