其他
如何在高性能的前提下,降低数据库存储成本?
OceanBase 高级开发工程师,TPC-H 项目组成员。目前在OceanBase 存储-分析处理组,工作方向是存储结构和分析处理功能的维护与开发。
作为完全自主研发的原生分布式数据库,OceanBase 在存储架构、数据编码、数据日志等方面不断挑战技术极限,进一步拓展了高级压缩技术能力的边界。其中,基于数据编码的存储压缩技术是 OceanBase 实现高压缩比的核心技术之一,OceanBase 自研了一套对数据库进行行列混存编码的压缩方法 (encoding),使用列级别的字典、差值、前缀等编码算法,在通用压缩算法之前对数据进行编码压缩,可以在不影响数据读写性能的同时,显著提高数据压缩率,帮助用户大大降低存储成本。本篇文章将分享 OceanBase 对数据库压缩技术的思考,介绍我们在数据编码领域的技术创新思路与方案:
数据压缩究竟在解决什么问题; 如何做出更适合实际业务场景的数据压缩; 数据编码压缩的效果测试。
消除了传统 B+Tree 的磁盘随机写瓶颈和存储空间碎片化问题,使得数据写入性能比传统的实时更新数据块的方式更高; 可以将数据更新(增删改)与压缩动作解耦,数据更新路径上没有压缩动作,对性能影响更小; 在批量落盘的过程中,数据库可以自适应地调整数据块中的数据数量,并在连续对数据块进行压缩的过程中,利用上一个块的压缩率等先验知识对下一个块进行更好的压缩。
场景一:业务中通过一列数据存储城市,性别,产品分类等具有类型属性的值时,这些列数据块内部数据的基数(cardinality)也会比较小,这时数据库可以直接在用户数据字段上建立字典,来实现更高的压缩率; 场景二:在有的业务场景中数据是按时序插入到数据库中的,那么这些插入的数据行中的时间相关字段,自增序列等数据的值域会相对比较小,也会有单调递增等特性,那么利用这些特性数据库也可以更方便地为这些数据做 bit-packing,差值等编码。
当两列数据大部分值相同时,使用列间等值编码,这样一整列都是另外一列的引用,可以只存储与引用列的行不同的数据; 当一列数据是另外一列数据的前缀时,也可以使用列间子串编码,只存储完整的一列和一列的后缀。
往期推荐
▼ 点击“阅读原文”,直达上篇