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

数据库压缩技术简介

原创
作者头像
王磊-字节跳动
修改于 2021-01-17 10:38:10
修改于 2021-01-17 10:38:10
3.8K0
举报
文章被收录于专栏: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 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
压缩算法简介
压缩算法是一种通过减少数据量来节省存储空间或传输数据的技术。压缩算法可以分为两种类型:有损压缩和无损压缩。 有损压缩算法会牺牲一定的数据精度或质量,在压缩数据的同时丢失一些信息。这种算法适用于音频、视频等多媒体数据,例如JPEG和MP3等格式。 无损压缩算法则能够完全还原原始数据,不会造成数据丢失。这种算法适用于需要准确还原数据的场景,如文档、代码等,例如ZIP和GZIP等格式。 常见的压缩算法包括哈夫曼编码、Lempel-Ziv算法、Run-Length Encoding(RLE)等。这些算法通过不同的方式对数据进行编码和解码,以实现数据压缩和解压缩的目的。
FPGA开源工作室
2024/06/21
5090
压缩算法简介
ClickHouse的数据压缩策略
ClickHouse提供了多种压缩算法来满足不同场景的需求,用户可以根据数据类型和性能要求选择适当的压缩策略。
一凡sir
2023/10/11
1.8K0
ClickHouse的数据压缩策略
ClickHouse的数据压缩技术以及高并发和大规模数据处理优化
综上所述,ClickHouse提供多种压缩算法和压缩字典技术来节省存储空间。在选择压缩算法和压缩字典技术时,需要根据数据的特性、压缩率、压缩与解压缩速度以及查询性能等因素进行综合考虑。
一凡sir
2023/10/23
1.4K0
ClickHouse的数据压缩技术以及高并发和大规模数据处理优化
K4os.Compression.LZ4:.NET 平台的快速无损压缩库
数据压缩技术常用于减少存储空间和网络传输负载。LZ4 是一种快速无损压缩算法,速度快,适合高性能场景。K4os.Compression.LZ4 是为 .NET 平台设计的 LZ4 实现,支持 .NET Core、.NET Framework、Mono、Xamarin 和 UWP。本文介绍该库的功能、用法、性能和与其他算法的对比。
郑子铭
2025/07/17
1090
K4os.Compression.LZ4:.NET 平台的快速无损压缩库
速度与压缩比如何兼得?压缩算法在构建部署中的优化
压缩在数据传输和存储过程中经常扮演着十分重要的角色,因此提高压缩的效率可以帮助我们节省时间和降低存储成本。本文介绍了压缩算法的优化在构建部署平台的应用,能够帮助研发团队提高研发和交付效率。
美团技术团队
2021/01/12
3K0
速度与压缩比如何兼得?压缩算法在构建部署中的优化
ClickHouse的数据压缩方式和数据分区操作
在ClickHouse中,数据分区是一种将表中的数据根据特定的规则划分成不同的部分,并将这些部分存储在独立的目录中的技术。数据分区可以提高查询性能、减少存储空间的使用,并且可以根据业务需求进行优化。
一凡sir
2023/10/13
1.3K0
ClickHouse的数据压缩方式和数据分区操作
HBase中的数据压缩与存储优化策略
HBase中的数据压缩主要是通过对HFile文件进行压缩来实现的。HFile是HBase存储在HDFS上的底层文件格式,每个HFile文件都包含一个或多个数据块(Block),这些数据块可以使用不同的压缩算法进行压缩。当数据写入HBase时,数据首先会被写入内存中的MemStore,随后被flush到磁盘上,生成HFile文件。在生成HFile文件的过程中,数据块会根据配置的压缩算法进行压缩。
二一年冬末
2024/09/04
4510
Hive的数据压缩介绍及使用
在实际工作当中,hive当中处理的数据,一般都需要经过压缩,前期我们在学习hadoop的时候,已经配置过hadoop的压缩,我们这里的hive也是一样的,可以使用压缩来节省我们的MR处理的网络带宽。
大数据梦想家
2021/01/22
1.3K0
对双标准数据压缩的一些认识
事接上回,当我继续想办法看懂 Brotli的第一阶段时,发现自己卡住了。毕竟自己的基础不是很好,只能想办法去解决,苦闷了一个下午,没办法,只能去死磕这一阶段参考的几篇论文。而我磕的四篇论文中的第一篇,就是这个—— 《Bicriteria Data Compression》。
繁依Fanyi
2023/05/07
3520
对双标准数据压缩的一些认识
Hadoop支持的压缩格式,是否支持split,什么场景下使用,建议收藏
Hive 建设离线数据仓库通常符合:一次写入,多次读取。所以需要我们在建表的时候选择恰当的存储格式和数据的压缩模式。
大数据学习指南
2023/01/11
1.4K0
ClickHouse在数据压缩和存储方面的一些创新技术和策略,选择 ClickHouse 的好处
ClickHouse通过列式存储、数据压缩算法、数据字典压缩、稀疏列压缩以及数据分区和分布式存储等创新技术和策略,实现了高效的数据压缩和存储。这使得ClickHouse在处理大规模数据和高吞吐量查询时具备了出色的性能。
一凡sir
2023/10/10
5750
ClickHouse在数据压缩和存储方面的一些创新技术和策略,选择 ClickHouse 的好处
2021年大数据Hive(九):Hive的数据压缩
在实际工作当中,hive当中处理的数据,一般都需要经过压缩,可以使用压缩来节省我们的MR处理的网络带宽
Lansonli
2021/10/11
9630
Kafka 之压缩算法&Hash算法
Kafka 支持的压缩算法还挺多的,这一篇来站在Kafka的角度看一下压缩算法。就当前情况来说,支持GZIP、Snappy、LZ4 这三种压缩算法。具体是通过compression.type 来开启消息压缩并且设定具体的压缩算法。
邹志全
2019/07/31
2.1K0
ClickHouse(06)ClickHouse建表语句DDL详细解析
创建新表具有几种种语法形式,具体取决于用例。默认情况下,仅在当前服务器上创建表。分布式DDL查询作为子句实现,该子句另外描述。
张飞的猪
2024/03/09
1K0
ClickHouse(06)ClickHouse建表语句DDL详细解析
打造次世代分析型数据库(三):列存表最佳实践
作者介绍 作者介绍:jennyerchen(陈再妮),PostgreSQL ACE成员,TDSQL PG开源版负责人,有多年分布式数据库内核研发经验,曾供职于百度数据库团队,加入腾讯后参与了TDSQL PG版异地多活、读写分离、Oracle兼容等多个核心模块的研发,当前主要负责CDW PG的存算分离相关特性的研发工作。 背景简介 CDW PG是腾讯自主研发的新一代分布式数据库,其具备业界领先的数据分析能力,在提供大型数据仓库处理能力的同时还能完整支持事务, 采用无共享的集群架构,适用于PB级海量 OLAP
腾讯云大数据
2022/08/26
7570
打造次世代分析型数据库(三):列存表最佳实践
消息队列面试解析系列(七)- 数据压缩
Kafka使用数据压缩,最高可提升约几十倍吞吐量。数据压缩不仅可节省存储空间,还可用于提升网络传输性能。这种使用压缩提升系统性能的方法,不仅在MQ使用,日常开发也可。比如传输大量数据或要在磁盘、数据库中存储较大数据,这些情况下,都可考虑使用数据压缩提升性能,还能节省网络带宽和存储空间。
JavaEdge
2021/02/22
8710
消息队列面试解析系列(七)- 数据压缩
Hive常见的压缩格式
Hive支持的压缩格式有bzip2、gzip、deflate、snappy、lzo等。Hive依赖Hadoop的压缩方法,所以Hadoop版本越高支持的压缩方法越多,可以在$HADOOP_HOME/conf/core-site.xml中进行配置:
十里桃花舞丶
2021/01/06
3.7K0
Prometheus 参考实现的时序数据库 Gorilla 介绍
在大型微服务架构中,服务监控和实时分析需要大量的时序数据。存储这些时序数据最高效的方案就是使用时序数据库 (TSDB)。设计时序数据库的重要挑战之一便是在效率、扩展性和可靠性中找到平衡。这篇论文介绍的是 Facebook 内部孵化的内存时序数据库,Gorilla。Facebook 团队发现:
我是阳明
2022/04/06
1.4K0
Prometheus 参考实现的时序数据库 Gorilla 介绍
Hive中的压缩技术是如何实现的?请解释其原理和常用压缩算法。
在Hive中,压缩技术被广泛应用于减少存储空间和提高查询性能。Hive使用压缩技术来减少数据文件的大小,从而节省磁盘空间,并且在查询时可以更快地读取和处理压缩的数据。
GeekLiHua
2025/01/21
2360
【YashanDB 知识库】关于表空间压缩
1、YashanDB 的表空间压缩通过文件打洞(Hole Punching)实现。
用户10349277
2025/02/28
800
推荐阅读
相关推荐
压缩算法简介
更多 >
交个朋友
加入[数据] 腾讯云技术交流站
获取数据实战干货 共享技术经验心得
加入数据技术工作实战群
获取实战干货 交流技术经验
加入[数据库] 腾讯云官方技术交流站
数据库问题秒解答 分享实践经验
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档