OceanBase 数据库的高级压缩功能采用全新设计的行列混合存储结构,以及高效的数据编码技术与一系列综合的数据压缩算法结合的方法,实现了在使用相同后端进行压缩的场景下,存储空间⼤幅减少。

行列混合存储结构

在 OceanBase 数据库中,磁盘空间以宏块为单位进行分配,大小固定为 2 M。每个宏块由若干个微块组成, 微块的尺⼨可以改变,默认为 16 K。

数据库在进行合并时,会对需要保存的数据进行分析,当需要保存的数据达到一定的行数后,则按照列为单位进行分析,同时根据数据的特点决定按照行或者列进行保存,这种方法即是在原有的行存储结构上,新增了一种行列混合存储结构。在行列混合存储结构中,同一行的所有数据仍然会存放在一个微块中,但在该微块内的所有行会按照列进行存储。

数据编码

数据编码有利于提⾼查询性能,这是因为编码后的数据不需要解码即可直接⽀持部分查询。

OceanBase 数据库在对数据进行分析的过程中,会选择合适的编码算法。当前,OceanBase 数据库支持多种数据编码技术,比较常见且有效的几种编码方式如下:

  • 字典编码

    将重复性较高的数据进行去重,再把去重后的数据建立成字典,而将原来存放数据的地方存为指向特定字典下标的引用。此外,字典中的各数据按类型排序,这样既有利于数据压缩,也可以在计算时直接将谓词下压到字典上,通过二分逻辑完成快速迭代。

  • RLE 编码

    对于连续相等的数据,例如:100,100,100,120,120,120,150,150,……,将连续的数据去重,仅保留其起始行号和值。

    RLE 编码在数据库中通常用于处理有序数据,例如,索引前缀和索引后缀等。

  • 差值编码

    数值型编码,适用于在一个小值域范围内分布的整数型数据,通过计算区间内的最小值和最大值,然后将数据减去最小值后,用更小的位宽进行编码。

  • 常量编码

    编码识别一个最常见的数据作为常量,只记录所有不等于这个常量的异常值和它们的行号。

除此以外,OceanBase 数据库还提供了字符串前缀编码、Hex 编码、列间等值编码、列间子串编码等多种编码方式。您可以针对不同类型的业务和不同类型的数据进行编码。OceanBase 数据库会在合并时根据数据的特点选择合适的编码类型,并计算数据的压缩比,如果发现压缩比不高,会尽快回退,选择其他的编码方式,从而确保数据编码的过程不会影响正常的数据写入性能。如果您对数据的特点非常了解,您也可以在创建表时,手动指定编码方式。

数据压缩

数据压缩、解压缩通常都需要消耗资源,同时还会影响查询的性能,并且数据尺寸越大,影响就越明显。在对数据进行编码之后,通常尺寸都会大幅下降,对编码后的数据再进行压缩,就可以进一步节省空间,并且还能降低因压缩、解压缩消耗资源所带来的性能影响。

OceanBase 数据库支持 lz4_1.0、snappy_1.0、zlib_1.0 和 zstd_1.0 等多种压缩算法。