关于MySQL表压缩功能的使用及性能影响
1.什么是表压缩简单讲表压缩就是通过一些手段降低数据表磁盘空间的占用通常有以下几种方式优化表OPTIMIZE TABLE命令重新组织表中的数据清理碎片以减少空间使用引擎层面解决设置表的存储格式例如在创建innodb表时设置ROW_FORMATCOMPRESSED能够使用比默认的16K更小的页。方式1请移步https://blog.csdn.net/weixin_43816711/article/details/135648862?spm1001.2014.3001.5501方式2目前 myisam、innodb、tokudb、MyRocks 等引擎都支持表的压缩。这里只对 InnoDB 做详细说明。innodb 在 MySQL 5.5 的时候就支持了压缩功能只是压缩比比较低通常在 50%左右。而 tokuDB 能达到 80%左右MyRocks 的压缩比能达到 70%左右。2. 为什么要表压缩存储成本压缩意味着在硬盘和内存之间传输的数据更小且占用相对少的内存及硬盘对于辅助索引这种压缩带来更加明显的好处因为索引数据也被压缩了。压缩对于硬盘是SSD的存储设备尤为重要因为它们相对普通的HDD硬盘比较贵且容量有限。使用场景采用压缩表一般都用在数据量太大磁盘空间不足IO负载大但服务器CPU有比较多的余量的场景。CPU和内存的速度远远大于磁盘对于数据库服务器磁盘IO可能会成为紧要资源或者瓶颈。数据压缩能够让数据库变得更小从而减少磁盘的I/O,还能提高系统吞吐量以很小的成本牺牲一部分CPU资源。对于读比重较多的应用压缩是特别有用。2.MySQL表压缩方法使用 innodb 压缩的前提条件是innodb_file_per_table这个参数要启用innodb_file_format这个参数设置成Barracuda。可以使用ROW_FORMATCOMPRESSED来create或者alter表来开启 innodb 的压缩功能如果没有指定KEY_BLOCK_SIZE的大小默认KEY_BLOCK_SIZE为innodb_page_size大小的一半也可以通过指定KEY_BLOCK_SIZEn参数来开启 innodb 的压缩功能n 可以为 1、2、4、8、16单位是 K。n 的值越小压缩比越高消耗的 CPU 资源也越多。注意 32K 或者 64K 的页不支持压缩。启用压缩后索引数据也同样会被压缩。你也可以通过调整 innodb_compression_level 来设置压缩的级别级别从 1~9默认是 6。级别越低意味着压缩比越高同时也意味着需要更多的 CPU 资源。注意压缩比和存储的数据组成有很大的关系并不是所有的数据都能达到上面所说的压缩比。如果大部分都是字符串并且重复的数据比较多压缩比会很好。2.MySQL表压缩原理数据库中的表是由一行行记录rows所组成每行记录被存储在一个页中在 MySQL 中一个页的大小默认为 16K一个个页又组成了每张表的表空间。如果一个页中存放的记录数越多数据库的性能越高。这是因为数据库表空间中的页是存放在磁盘上MySQL 数据库先要将磁盘中的页读取到内存缓冲池然后以页为单位来读取和管理记录。那么一个页中存放的记录越多内存中能存放的记录数也就越多那么存取效率也就越高。若想将一个页中存放的记录数变多可以启用压缩功能。此外启用压缩后存储空间占用也变小了同样单位的存储能存放的数据也变多了。若要启用压缩技术数据库可以根据记录、页、表空间进行压缩不过在实际工程中我们普遍使用页压缩技术这是为什么呢压缩每条记录每次读写数据都要压缩和解压对CPU的计算过于依赖会导致性能明显下降另外每条数据的大小一般都不会太大对于每条数据都进行压缩的话压缩效率也不是很好。压缩表空间对表空间的压缩其实压缩效率还是不错的但是它要求表空间文件要保持静态这对关系型数据库来讲又不现实。不过业务中的历史数据倒是可以考虑而基于页的压缩既能提升压缩效率又能在性能之间取得一种平衡。这里大家可能要担心了启用页压缩的话性能会有损失因为压缩需要额外的CPU计算。确实压缩会给CPU带来一定的消耗。但压缩并不意味着性能下降有可能还能提升性能呢因为大部分的数据库业务系统CPU的处理能力是有余力的也就是计算时过剩的。IO负载才是数据库的主要瓶颈。通过页压缩技术MySQL可以把16K的页压缩到8K或是4K。这样一来从磁盘读取或写入时就能将IO请求大小减半。从而提升数据库的整体性能。1、COMPRESS 页压缩COMPRESS 页压缩是 MySQL 5.7 版本之前提供的页压缩功能。只要在创建表时指定ROW_FORMATCOMPRESS并设置通过选项 KEY_BLOCK_SIZE 设置压缩的比例。虽然是通过选项 ROW_FORMAT 启用压缩功能但这并不是记录级压缩依然是根据页的维度进行压缩。比如以下示例我们将一张日志表ROW_FROMAT 设置为 COMPRESS表示启用 COMPRESS 页压缩功能KEY_BLOCK_SIZE 设置为 8表示将一个 16K 的页压缩为 8K。CREATETABLEsys_log(logIdBINARY(16)PRIMARYKEY,......)ROW_FORMATCOMPRESSED KEY_BLOCK_SIZE8COMPRESS 页压缩就是将一个页压缩到指定大小比如从16K压缩到8K但是如果无法压缩到8K则会产生两个8K的页。COMPRESS 页压缩适合用于一些对性能不敏感的业务表例如日志表、监控表、告警表等压缩比例通常能达到 50% 左右。虽然 COMPRESS 压缩可以有效减小存储空间但 COMPRESS 页压缩的实现对性能的开销是巨大的性能会有明显退化。主要原因是一个压缩页在内存缓冲池中存在压缩和解压两个页。为了 解决压缩性能下降的问题从MySQL 5.7 版本开始推出了 TPC 压缩功能。如何评估 KEY_BLOCK_SIZE 是否合适为了更深入地了解压缩表对性能的影响在 Information Schema 库中有对应的表可以用来评估内存的使用和压缩率等指标。INNODB_CMP 是收集的是某一类的 KEY_BLOCK_SIZE 压缩表的整体状况的信息汇总的是所有 KEY_BLOCK_SIZE 压缩表的统计。而 INNODB_CMP_PER_INDEX 表则是收集各个表和索引的压缩情况信息这些信息对于在某个时间评估某个表的压缩效率或者诊断性能问题很有帮助。INNODB_CMP_PER_INDEX 表的收集会导致系统性能受到影响必须 innodb_cmp_per_index_enabled 选项才会记录生产环境最好不要开启。我们可以通过观察 INNODB_CMP 表的压缩失败情况如果失败比较多则需要调大 KEY_BLOCK_SIZE。一般建议 KEY_BLOCK_SIZE 设置为 8。2、TPC压缩TPCTransparent Page Compression是 5.7 版本推出的一种新的页压缩功能其利用文件系统的空洞Punch Hole特性进行压缩。可以使用下面的命令创建 TPC 压缩表CREATETABLEsys_log logidBINARY(16)PRIMARYKEY,.....)COMPRESSIONZLIB|LZ4|NONE;要使用 TPC 压缩首先要确认当前的操作系统是否支持空洞特性。通常来说当前常见的 Linux 操作系统都已支持空洞特性。由于空洞是文件系统的一个特性利用空洞压缩只能压缩到文件系统的最小单位 4K且其页压缩是 4K 对齐的。比如一个 16K 的页压缩后为 7K则实际占用空间 8K压缩后为 3K则实际占用空间是 4K若压缩后是 13K则占用空间依然为 16K。空洞压缩的另一个好处是它对数据库性能的侵入几乎是无影响的小于 20%甚至可能还能有性能的提升。这是因为不同于 COMPRESS 页压缩TPC 压缩在内存中只有一个 16K 的解压缩后的页对于缓冲池没有额外的存储开销。另一方面所有页的读写操作都和非压缩页一样没有开销只有当这个页需要刷新到磁盘时才会触发页压缩功能一次。但由于一个 16K 的页被压缩为了 8K 或 4K其实写入性能会得到一定的提升。对一些对性能不敏感的业务表例如日志表、监控表、告警表等它们只对存储空间有要求因此可以使用 COMPRESS 页压缩功能。在一些较为核心的业务表上更推荐使用 TPC压缩。因为核心信息是一种非常重要的数据通常伴随高频、重要业务。比如上面提到的订单数据大部分的电商公司都会对历史订单数据去做单独存储。以确保近期订单数据可以秒查。那么针对这个业务场景我们可以将历史数据启用TPC压缩功能对近三个月或六个月的订单数据不启用压缩。需要特别注意的是 通过命令ALTER TABLE xxx COMPRESSION ZLIB可以启用 TPC页压缩功能但是这只对后续新增的数据会进行压缩对于原有的数据则不进行压缩。所以上述ALTER TABLE操作只是修改元数据瞬间就能完成。若想要对整个表进行压缩需要执行OPTIMIZE TABLE命令ALTER TABLE sys_log COMPRESSIONZLIBOPTIMIZE TABLE sys_log;【注意】表压缩操作可能会影响数据库性能因此建议在低峰时段进行这些操作。此外MySQL表压缩不会改变表中数据的内容只会减少其存储所需的磁盘空间。

相关新闻

MySQL部分查询写法

MySQL部分查询写法

1.根据a列进行分组,然后取b列最新的一条数据,b列是时间类型 使用子查询和GROUP BY SELECT yt.* FROM your_table yt INNER JOIN ( SELECT a, MAX(b) AS latest_b FROM your_table GROUP BY a ) AS latest_times ON yt.a latest_times.a AND yt…

2026/8/6 18:02:45 阅读更多 →
软件授权验证模块的机器码样本(无推广)

软件授权验证模块的机器码样本(无推广)

我在开发一个本地软件授权模块,需要生成和校验机器码。目前我计划采用对称加密Hash的方式,但担心碰撞和伪造问题。为了测试验证算法的可靠性,我生成了以下一批模拟机器码(仅用于算法测试,不涉及任何实际产品&#xff0…

2026/8/6 18:02:45 阅读更多 →
深度解析江西省建设监理网站的实用价值与注册流程揭秘

深度解析江西省建设监理网站的实用价值与注册流程揭秘

在这个快节奏的数字时代,建筑工程行业正经历着一场前所未有的信息化变革。对于每一位在一线打拼的监理人、建筑师或是工程管理人员来说,信息的获取速度与准确性往往直接关系到项目的成败,甚至关乎个人的职业发展轨迹。今天,我想和大家聊一个看似枯燥实则至关重要的话题——…

2026/8/6 18:01:44 阅读更多 →

最新新闻

ADR机器学习模型优化:提升检测准确性的完整指南

ADR机器学习模型优化:提升检测准确性的完整指南

ADR机器学习模型优化:提升检测准确性的完整指南 【免费下载链接】ADR ADR secures enterprise AI agents through observability, security benchmarking, and threat detection. Deployed at Uber. 项目地址: https://gitcode.com/GitHub_Trending/adr10/ADR …

2026/8/6 18:48:04 阅读更多 →
汽车音响模具检测方法对比评测

汽车音响模具检测方法对比评测

汽车音响模具检测怎么选?蓝光扫描vs三坐标vs激光测厚vs人工,横评对比汽车音响模具的检测,一搜方案一大堆:蓝光3D扫描、三坐标、激光测厚仪、人工卡尺……参数表看着都差不多,价格差得不少。到底哪个适合音响模具的质控…

2026/8/6 18:48:04 阅读更多 →
B站缓存视频合并终极方案:用m4s-converter轻松转换m4s为MP4

B站缓存视频合并终极方案:用m4s-converter轻松转换m4s为MP4

B站缓存视频合并终极方案:用m4s-converter轻松转换m4s为MP4 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 你是否曾经在B站缓存了珍…

2026/8/6 18:48:04 阅读更多 →
纯能量超流体宇宙假说

纯能量超流体宇宙假说

纯能量超流体宇宙假说:从粒子解构到能量本体的物理推导Pure Energy Superfluid Universe Hypothesis: From Particle Deconstruction to Energy Ontology作者 陈志科摘 要:本文基于现代物理学的基本现象,提出并推导了一种宇宙本体论模型&am…

2026/8/6 18:48:04 阅读更多 →
怎么理解阴影系统:一场“光与影的接力赛“

怎么理解阴影系统:一场“光与影的接力赛“

引子:一个"熟视无睹"的日常奇迹 想象你在Unity里搭建了一个简单场景。 一个平面——上面放一个立方体——再放一盏方向光。 点击Play——立方体投下了一道清晰的阴影在平面上**。 你满意地看着这个画面——觉得"这不是理所当然的吗?": **有光、有物…

2026/8/6 18:48:04 阅读更多 →
K8s最佳搭建实践

K8s最佳搭建实践

一.资源准备系统版本 centos7.9硬件需求 cpu 4个 内存2G 硬盘20G虚拟机数量 三台三个互通ip二.环境准备 三台主机分别执行2.1 关闭防火墙 selinux 交换内存 重启生效systemctl stop firewalld; systemctl disable firewalld; sed -i s/enforcing/disabled/ /etc/selinux/config…

2026/8/6 18:47:04 阅读更多 →

日新闻

深入解析LimboAI C++内核:架构设计与性能优化实战

深入解析LimboAI C++内核:架构设计与性能优化实战

1. 项目概述:为什么我们需要深入LimboAI的C内核?如果你是一名使用Godot引擎的游戏开发者,尤其是对AI行为逻辑有较高要求的项目,那么LimboAI这个名字你大概率不会陌生。它作为Godot 4生态中一个备受瞩目的行为树与状态机插件&#…

2026/8/6 0:00:06 阅读更多 →
Unity 2D游戏敌人AI系统:基于PlayMaker状态机与2D Toolkit的实战开发

Unity 2D游戏敌人AI系统:基于PlayMaker状态机与2D Toolkit的实战开发

1. 项目概述与核心思路大家好,我是老张,一个在游戏开发一线摸爬滚打了十多年的老码农。今天咱们接着聊《空洞骑士》风格2D动作游戏的Demo制作。上一期我们搭好了基础框架,处理了角色移动和碰撞,这一期,我们要让游戏世界…

2026/8/6 0:00:06 阅读更多 →
被动防火门市场前景发展趋势

被动防火门市场前景发展趋势

被动防火门依靠材质结构、密闭构造阻隔烟火蔓延,无需电控启动,是建筑被动消防系统核心构件,行业依托新规管控、城市更新、工业安全升级迎来稳定扩容,整体朝着合规化、专项化、低碳化、智能化方向发展。现阶段 GB12955‑2024 新版国…

2026/8/6 0:00:06 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/5 15:00:43 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/5 13:13:56 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/5 10:20:36 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/5 23:28:39 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/5 21:00:14 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/5 23:46:51 阅读更多 →