Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >数据库压缩技术简介

数据库压缩技术简介

原创
作者头像
王磊-字节跳动
修改于 2021-01-17 10:38:10
修改于 2021-01-17 10:38:10
3.9K0
举报
文章被收录于专栏:01ZOO01ZOO

为什么要压缩

最近接触到一些海量数据存储的需求,为了解决这样的需求,一个想法是对数据进行一定程度的聚合。在应用层的聚合方式,这里不展开。但是让我联想到的是以前学习 prometheus tsdb的时候接触到的压缩技术。即使本质上来讲,应用层的数据聚合,就是一种数据压缩技术。而 tsdb 使用的 gorilla 技术令人印象深刻。有兴趣的可以详细看一下 prometheus 作者的这篇博客, 以及其使用的技术 gorilla 的 paper. 简而言之 prometheus 的 tsdb 简洁强大,受益于其高效的压缩【gorilla 平均能压缩 16 byte samples to an average of 1.37 bytes】和查询效率,其单机的设计并没有影响他在众多场景中的广泛使用。

从这个例子可以看出,好的压缩技术对于 data intensive applications 是非常关键的【建议新版 ddia 加一章】。总结来说,对数据库数据的压缩,至少有以下的好处:

  1. 使用更小的空间,节约成本,有调研认为,实际上存储的成本要高于 cpu 和内存,尽管单价更低,然而存储需求空间的膨胀高于对计算的需求。
  2. 更小的空间意味着更小的 seek distance,更多的单次读出数据,对磁盘的查询效率会更高【当然数据更小,数据库也可以做更多优化,比如更智能的 clustering of related objects into physically near locations】。
  3. 提高各种单位带宽的传输数据,这些带宽包括不限于:磁盘与内存,内存与 cpu 缓存,Client-Server 系统中的客户端和存储服务端之间的数据传输,这些对于访问数据库的端到端性能非常关键【这里面还包含了各级缓存的 hit rate 的提高】。

关于为什么要压缩,一篇比较老的论文 【Data Compression and Database Performance】给出了一些实际低数据,证明即使在传统的 (row based) 数据库领域,压缩往往也是很有好处的。更不用说各种列式数据库或者时序数据库了【由于其数据特点,往往更适合压缩】

压缩技术简介

由于数据库的特殊场景,和 generic 的数据压缩技术相比,应用的数据库中还需要考虑下面几点

  1. 应用在什么层次,row、column、page、field?
  2. 对于取数据的影响如何,比如 projection、join 查询,query 之前是否要先解压缩,如果是固定压缩方式,往往不需要先解压缩,这样效率就会高很多
  3. 对于不同的数据库,比如关系型、nosql、列式数据、时序,压缩方式往往有所不同,尽管有一些技术是通用的。

下面会介绍先一些常用的传统技术,然后介绍在各种数据库中使用的压缩方式。

字典压缩 - Dictionary Compression

这种技术很简单,即把不同的字段值转成一组数字,用数字来存储,这样就是大幅的压缩空间。比如下面这个例子。

代码语言:txt
AI代码解释
复制
# 原始数据
China
America
China
China
Japan
China

# 使用字典将数据转成 ID
China -> 1
America -> 2
Japan -> 3


# 压缩后的数据
1
2
1
1
3
1

这种技术很常用,尤其是对于文本的数据压缩,还可以利用类似 Huffman encoding 的技术对出现的 value 按照出现频率进行变长编码,可以进一步的优化空间。

前缀编码 - Prefix Encoding Compression

这种技术和下面的游程编码很类似,不同的是一般只对相同前缀进行压缩。比如对于一组文本,本身在存储的时候已经排序:user, used, useful, useless, 他们的前缀都相同,那么在存储的时候只需要存固定前缀和 r, d, ful, less。对于一些常见的场景,比如时间字符串,phone number,固定前缀是很常见的。

游程编码 - Run-length Encoding Compression

这种技术古老常见,看下面的例子

代码语言:txt
AI代码解释
复制
# 原始数据
AAAABBAACCC

# 压缩数据
A4B2A2C3

# 也可能是分开存储
数据:ABAC
开始位置: 0468

Cluster Encoding Compression

将数据分成多个 block,如果一个 block 里面的数据都一样,那么就替换成一个数字,比如下面的例子

代码语言:txt
AI代码解释
复制
# 原始数据
4444 4333 3333 1100

# 压缩数据
4 4333 3 1100

元数据 bit vector: 1010 其中1表示用一个数字做了整个 block 的替换

Sparse Encoding Compression

一种稀疏数据的压缩方式,思想就是先移除出现最多的数据,然后新增一个 bit vector 表示出现最多的数据的位置,比如下面的例子

代码语言:txt
AI代码解释
复制
# 原始数据
444332114444112

# 压缩数据
33211112
元数据:4 111000001111000  1 表示4出现在对应的位置

mysql 压缩

  • InnoDB 中默认使用 zlib 算法进行压缩,也可以选择 snappy、quicklz 等,详细的对比可以参考这里的一篇文章,简而言之: snappy 和 quicklz在压缩比和cpu消耗上保存了较好的平衡,这两种算法在新开发的软件中使用更为广泛,包括TokuDB、MongoDB等。
  • rocksdb 引擎的压缩率一般更高,其使用了 前缀编码和零填充行元数据的技术,提高了数据的压缩率,myrocks 的文档里面给了这样一个例子, 同样的数据在 InnoDB 占用 1172GB,在 MyRocks 中占用 574GB。

hbase 压缩

目前 HBase 可以支持的压缩方式有 GZ(GZIP)、LZO、LZ4 以及 Snappy。 它们之间的区别如下:

  • GZ:用于冷数据压缩,与 Snappy 和 LZO 相比,GZIP 的压缩率更高,但是更消耗 CPU,解压/压缩速度更慢。
  • Snappy 和 LZO:用于热数据压缩,占用 CPU 少,解压/压缩速度比 GZ 快,但是压缩率不如 GZ 高。
  • Snappy 与 LZO 相比,Snappy 整体性能优于 LZO,Snappy 压缩率比 LZO 更低,但是解压/压缩速度更快。
  • LZ4 与 LZO 相比,LZ4 的压缩率和 LZO 的压缩率相差不多,但是LZ4的解压/压缩速度更快。

下面的表格来自阿里云:

业务类型

无压缩表大小

LZO(压缩率/解压速度MB/s)

ZSTD(压缩率/解压速度MB/s)

LZ4(压缩率/解压速度MB/s)

监控类

419.75T

5.82/372

13.09/256

5.19/463.8

日志类

77.26T

4.11/333

6.0/287

4.16/496.1

风控类

147.83T

4.29/297.7

5.93/270

4.19/441.38

消费记录

108.04T

5.93/316.8

10.51/288.3

5.55/520.3

mongo 压缩

在MongoDB 中,WiredTiger为集合提供三个压缩选项:

  • 无压缩
  • Snappy(默认启用) – 很不错的压缩,有效利用资源【在各种文本测试场景中,压缩率约在54%~55%】
  • zlib(类似gzip) – 出色的压缩,但需要占用更多资源
  • zstd(从MongoDB 4.2开始支持)

clickhouse 压缩

其中使用的 通用压缩算法其实和别的数据库差不多,比如:

  • LZ4:非常高效的压缩算法,在SLS内部大量使用,压缩和解压性能都极强,尤其是解压性能可达到单核4GB/s。缺点是压缩率有点低(但是在日志场景可以达到5-15倍的压缩率,还是非常适用的)
  • ZSTD:虽然压缩/解压效率不如LZ4,但是也可以达到单核400M/s的压缩和1G/s左右的解压

列/时序压缩算法:适合按列存储数据,尤其适合时序场景,我们已经看到了 gorilla 在prometheus tsdb 中的成功应用,在适合的场景下,这种算法的压缩效果可能会达到惊人的 10% 甚至 1%,这部分的压缩方式和设计思想尤其值得我们学习。

  • Delta,其思想就是存储变化值,比如这样的数据: 1, 2, 3, 3, 2, 4, 会被压缩成 1(base), 1, 1, 0, -1, 2
  • DoubleDelta:存储的是 delta 的 delta,比如 1589636543 1589636553 1589636563 1589636573 1589636583 1589636594 1589636603, 会被压缩成 1589636543(Base) 10(Delta) 0 0 0 1 -1 ...
  • Gorilla: 其实 DoubleDelta 是参考的 facebook 的 Gorilla 论文,而 clickhouse 中的 gorilla 则是针对 double 数值的一种变化。通过异或的形式来计算前后的 Delta,来解决 DoubleDelta 对于 double 数据压缩很差的问题。
  • T64:2019年新引入的编码方式,T64只支持int/uint类型的压缩。首先压缩前拿到数据类型,然后会计算数据的Max Min,根据Max Min获得有效的bit位,然后把数据映射到64*bit位的空间,由于64是固定的,因此叫做T64。

类似 Delta、DoubleDelta 的算法存在的一个问题是,取数据需要一整块全部取出来,才能恢复出数据,有点类似视频压缩中,需要关键帧,仅仅用 p 帧无法恢复数据。

在 clickhouse 中往往是几种算法组合使用。效果可以参考这篇文章

prometheus

其实在上面的 clickhouse 里面已经介绍了 prometheus 使用的压缩算法,即 DoubleDelta,不过作为一个比较简洁的基于 lsm tree 的时序数据库实现,其中的比如 compaction 方式、文件存储方式、标签(label)的存储方式值得学习。相关的几个有用的参考:

参考

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
如何正确选择Hadoop数据压缩格式:Gzip vs LZO vs Snappy
在大数据生态中,数据压缩是优化存储成本、提升I/O效率和加速计算的关键技术。Hadoop生态中主流压缩格式Gzip、LZO和Snappy各有特点,正确选择能显著提升集群性能。本文将深入分析其特性并提供选型指南。
编程小白狼
2025/08/17
880
从零实现一个时序数据库
时序数据库(TSDB: Time Series Database)大多数时候都是为了满足监控场景的需求,这里先介绍两个概念:
麒思妙想
2021/08/12
1.6K0
从零实现一个时序数据库
夏天了,和Doris一起减肥吧!
传统的行式存储好比胡吃海塞的减肥失败者,什么都往肚子里塞:张三的姓名、年龄、工资混在一起存,李四的信息又是另一堆。
一臻数据
2025/06/28
530
夏天了,和Doris一起减肥吧!
ClickHouse的数据压缩策略
ClickHouse提供了多种压缩算法来满足不同场景的需求,用户可以根据数据类型和性能要求选择适当的压缩策略。
一凡sir
2023/10/11
1.9K0
ClickHouse的数据压缩策略
K4os.Compression.LZ4:.NET 平台的快速无损压缩库
数据压缩技术常用于减少存储空间和网络传输负载。LZ4 是一种快速无损压缩算法,速度快,适合高性能场景。K4os.Compression.LZ4 是为 .NET 平台设计的 LZ4 实现,支持 .NET Core、.NET Framework、Mono、Xamarin 和 UWP。本文介绍该库的功能、用法、性能和与其他算法的对比。
郑子铭
2025/07/17
1580
K4os.Compression.LZ4:.NET 平台的快速无损压缩库
Hive的数据压缩介绍及使用
在实际工作当中,hive当中处理的数据,一般都需要经过压缩,前期我们在学习hadoop的时候,已经配置过hadoop的压缩,我们这里的hive也是一样的,可以使用压缩来节省我们的MR处理的网络带宽。
大数据梦想家
2021/01/22
1.3K0
从Druid到ClickHouse | eBay广告平台数据OLAP实战
本文介绍eBay广告数据平台的基本情况,并对比分析了ClickHouse与Druid的使用特点。基于ClickHouse表现出的良好性能和扩展能力,本文介绍了如何将eBay广告系统从Druid迁移至ClickHouse,希望能为同业人员带来一定的启发。
Spark学习技巧
2020/12/28
1.8K0
从Druid到ClickHouse | eBay广告平台数据OLAP实战
压缩算法简介
压缩算法是一种通过减少数据量来节省存储空间或传输数据的技术。压缩算法可以分为两种类型:有损压缩和无损压缩。 有损压缩算法会牺牲一定的数据精度或质量,在压缩数据的同时丢失一些信息。这种算法适用于音频、视频等多媒体数据,例如JPEG和MP3等格式。 无损压缩算法则能够完全还原原始数据,不会造成数据丢失。这种算法适用于需要准确还原数据的场景,如文档、代码等,例如ZIP和GZIP等格式。 常见的压缩算法包括哈夫曼编码、Lempel-Ziv算法、Run-Length Encoding(RLE)等。这些算法通过不同的方式对数据进行编码和解码,以实现数据压缩和解压缩的目的。
FPGA开源工作室
2024/06/21
6090
压缩算法简介
ClickHouse的数据压缩技术以及高并发和大规模数据处理优化
综上所述,ClickHouse提供多种压缩算法和压缩字典技术来节省存储空间。在选择压缩算法和压缩字典技术时,需要根据数据的特性、压缩率、压缩与解压缩速度以及查询性能等因素进行综合考虑。
一凡sir
2023/10/23
1.4K0
ClickHouse的数据压缩技术以及高并发和大规模数据处理优化
打工人必备:Hive小文件合并与数据压缩
Hive仓库表数据最终是存储在HDFS上,由于Hadoop的特性,对大文件的处理非常高效。而且大文件可以减少文件元数据信息,减轻NameNode的存储压力。但是在数据仓库中,越是上层的表汇总程度就越高,数据量也就越小,而且这些表通常会有日期分区,随着时间的推移,HDFS的文件数目就会逐步增加。
王知无-import_bigdata
2020/12/18
2.6K0
打工人必备:Hive小文件合并与数据压缩
OceanBase 历史数据归档方案技术原理解读
面对快速增长的在线数据,尤其在例如订单、交易、日志等场景,数据往往多呈现为流水型特征,写入一段时间后即不会再次访问或更新;对访问频率很低甚至为0的数据,其占用的在线业务库固态存储空间,造成了大量硬件资源浪费,堆高企业的IT成本。同时,传统数据归档方案往往是业务研发或 DBA 采用脚本或简单的同步工具进行,难以在并发和效率上有效控制,很容易对在线数据库产生影响,严重的甚至导致生产数据误删事故。
公众号:码到三十五
2024/05/27
3320
OceanBase 历史数据归档方案技术原理解读
2021年大数据Hive(九):Hive的数据压缩
在实际工作当中,hive当中处理的数据,一般都需要经过压缩,可以使用压缩来节省我们的MR处理的网络带宽
Lansonli
2021/10/11
9800
ClickHouse的数据压缩方式和数据分区操作
在ClickHouse中,数据分区是一种将表中的数据根据特定的规则划分成不同的部分,并将这些部分存储在独立的目录中的技术。数据分区可以提高查询性能、减少存储空间的使用,并且可以根据业务需求进行优化。
一凡sir
2023/10/13
1.3K0
ClickHouse的数据压缩方式和数据分区操作
Prometheus 参考实现的时序数据库 Gorilla 介绍
在大型微服务架构中,服务监控和实时分析需要大量的时序数据。存储这些时序数据最高效的方案就是使用时序数据库 (TSDB)。设计时序数据库的重要挑战之一便是在效率、扩展性和可靠性中找到平衡。这篇论文介绍的是 Facebook 内部孵化的内存时序数据库,Gorilla。Facebook 团队发现:
我是阳明
2022/04/06
1.5K0
Prometheus 参考实现的时序数据库 Gorilla 介绍
计算型存储:异构计算的下一个关键应用
AWS re:Invent2019显示AWS市场占用率达到45%,相比2018年营收增长29%。使用专用芯片构建用于加速特定场景的战略更加清晰,除去Intel和AMD的X86和Nvidia GPU,还有通过其Annapurna Labs部门推出的基于Arm的Graviton的定制芯片,并承诺基于Graviton2(7纳米)的新型EC2实例的性能是第一代Graviton的7倍。
数据和云
2020/12/21
7680
计算型存储:异构计算的下一个关键应用
IoTDB 深度剖析:物联网数据存储的利器与注册全攻略
传统的数据库就像一个年久失修的老车,面对高速的时序数据,它显得力不从心。时序数据具有以下特性:
云边有个稻草人
2025/07/23
2220
IoTDB 深度剖析:物联网数据存储的利器与注册全攻略
ClickHouse(06)ClickHouse建表语句DDL详细解析
创建新表具有几种种语法形式,具体取决于用例。默认情况下,仅在当前服务器上创建表。分布式DDL查询作为子句实现,该子句另外描述。
张飞的猪
2024/03/09
1.1K0
ClickHouse(06)ClickHouse建表语句DDL详细解析
【YashanDB 知识库】关于表空间压缩
1、YashanDB 的表空间压缩通过文件打洞(Hole Punching)实现。
用户10349277
2025/02/28
940
速度与压缩比如何兼得?压缩算法在构建部署中的优化
压缩在数据传输和存储过程中经常扮演着十分重要的角色,因此提高压缩的效率可以帮助我们节省时间和降低存储成本。本文介绍了压缩算法的优化在构建部署平台的应用,能够帮助研发团队提高研发和交付效率。
美团技术团队
2021/01/12
3.1K0
速度与压缩比如何兼得?压缩算法在构建部署中的优化
基于 Chiplets 设计的高压缩比SRAM模块
文档由 Nilesh Shah (ZeroPoint Technologies) 发表,探讨了未来内存和存储技术的发展方向,特别是基于Chiplets的压缩LLC缓存与内存扩展技术。
数据存储前沿技术
2025/02/11
2800
基于 Chiplets 设计的高压缩比SRAM模块
相关推荐
如何正确选择Hadoop数据压缩格式:Gzip vs LZO vs Snappy
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档