OceanBase 通过数据编码压缩技术实现高压缩。数据编码是基于数据库关系表中不同字段的值域和类型信息,所产生的一系列的编码方式,它比通用的压缩算法更懂数据,从而能够实现更高的压缩效率。
按列压缩会比按行压缩更有效,这是因为关系表从列的方向去看,相邻字段由于具有相同数据类型和值域范围,其数据的相似性要远远好于从行的维度,所以 OceanBase 是按照列进数据编码的。另外,OceanBase 的读写分离架构使得数据总是批量写入磁盘,这种模式相比传统的脏页回刷磁盘的方式更加适合于数据压缩。
数据编码不仅有利于节省空间,也有利于提高查询性能。这是因为编码后的数据不需要解码,就可以直接支持查询,而即使最快速的lz4压缩算法,也需要在数据访问前将整个数据块进行解压。另外,数据编码使得同一个数据块中能够容纳更多的数据,IO 的性能也随之提升。
OceanBase 实现了多种数据编码方法,包括字典编码、RLE 编码、常量编码、差值编码、前缀编码、列间编码等,并自动的为每一列选择最合适的数据编码。在数据编码的基础上进一步对编码后的数据使用通用压缩算法进行压缩。通过编码和压缩,使用相同的块大小(16KB)、以及相同的压缩算法(lz4),同样的数据存放在 OceanBase 中,要比在 MySQL 5.7 中平均节省一半的空间,同时没有损失任何性能,查询性能基本没有变化,写入(合并)性能反而较原有系统有了较大的提升。