当前位置: 首页 > news >正文

实用指南:MySQL InnoDB表压缩:性能优化全解析

这段内容是 MySQL 官方文档 17.9.1 节:InnoDB 表压缩(InnoDB Table Compression) 的引言部分,它是一个子章节的总览,告诉你接下来要讲什么。

我们来一步步拆解、解释和通俗化这段内容,帮助你彻底理解 “InnoDB 表压缩” 是什么、怎么用、以及它在整个 MySQL 压缩体系中的定位。


一句话总结

InnoDB 表压缩 是一种通过 ROW_FORMAT=COMPRESSED 来启用的压缩技术,适用于使用 独立表空间(file-per-table)或通用表空间(general tablespace) 的 InnoDB 表。它的目标是 减少磁盘和内存中的数据量,提升性能和存储效率


一、什么是 “InnoDB 表压缩”?

✅ 定义:

InnoDB 表压缩(Table Compression)是一种 在页级别对数据和索引进行压缩 的技术,压缩后的数据存储在磁盘上,读取时再解压到内存中。

它不是“文件系统压缩”,而是 InnoDB 存储引擎原生支持的压缩机制


二、支持的表空间类型(重要前提)

文档强调:

“supported with InnoDB tables that reside in file_per_table tablespaces or general tablespaces

意思是:只有以下两种表空间支持表压缩

表空间类型说明
file_per_table(独立表空间)每个表一个 .ibd 文件(默认开启)
通用表空间(General Tablespace)多个表共享一个 .ibd 文件(MySQL 5.7+ 引入)
❌ 系统表空间(ibdata1不支持压缩!

所以,只要你的表是默认创建的(每个表一个 .ibd 文件),就可以使用表压缩。


️ 三、如何启用表压缩?

使用 ROW_FORMAT=COMPRESSED

1️⃣ 创建表时启用

CREATE TABLE t1 (
id INT PRIMARY KEY,
name VARCHAR(100)
) ROW_FORMAT=COMPRESSED
KEY_BLOCK_SIZE=8;  -- 可选:目标压缩页大小(KB)
  • ROW_FORMAT=COMPRESSED:启用压缩
  • KEY_BLOCK_SIZE:指定压缩后的页大小(单位 KB),可选值:1, 2, 4, 8

例如:KEY_BLOCK_SIZE=8 表示希望将 16KB 的原始页压缩成 8KB 存储

2️⃣ 修改已有表

ALTER TABLE t1
ROW_FORMAT=COMPRESSED
KEY_BLOCK_SIZE=8;

⚠️ 注意:ALTER TABLE 会重建表,可能耗时较长。


四、接下来各小节内容预告(目录解析)

文档列出了 17.9.1 下的几个子章节,我们来解释每个部分讲什么:


17.9.1.1 Overview of Table Compression(概述)


17.9.1.2 Creating Compressed Tables(创建压缩表)

  • 详细语法:CREATE TABLE ... ROW_FORMAT=COMPRESSED
  • KEY_BLOCK_SIZE 的含义和选择
  • 存储空间计算示例
  • 如何选择合适的压缩页大小

17.9.1.3 Tuning Compression for InnoDB Tables(调优)


17.9.1.4 Monitoring InnoDB Table Compression at Runtime(运行时监控)

  • 如何查看压缩效果
  • 使用 INFORMATION_SCHEMA.INNODB_CMPINNODB_CMP_PER_INDEX
    • 压缩尝试次数
    • 成功次数
    • 压缩失败原因
    • 平均压缩比

示例查询:

SELECT * FROM INFORMATION_SCHEMA.INNODB_CMP;

输出字段如:

  • page_size:压缩页大小
  • compress_ops:压缩操作次数
  • compress_ops_ok:成功次数
  • compress_time / uncompress_time:耗时

17.9.1.5 How Compression Works for InnoDB Tables(压缩原理)

  • 底层机制:InnoDB 如何压缩和解压页
  • 使用 zlib 算法
  • 压缩发生在写入磁盘前,解压发生在读入 Buffer Pool 时
  • 压缩页在内存中仍是解压状态
  • 为什么不能压缩所有类型的页(如 undo log)

17.9.1.6 Compression for OLTP Workloads(OLTP 工作负载的压缩)


17.9.1.7 SQL Compression Syntax Warnings and Errors(语法警告和错误)

  • 常见错误:
    • 在系统表空间中启用压缩 → 报错
    • KEY_BLOCK_SIZE 超出范围 → 报错
    • 压缩参数不兼容 → 警告
  • 如何解读错误信息
  • 兼容性说明(不同 MySQL 版本)

⚖️ 五、表压缩的优缺点总结

✅ 优点❌ 缺点
减少磁盘空间使用增加 CPU 使用率(压缩/解压)
减少磁盘 I/O频繁更新可能导致“压缩失败”或“页分裂”
更多数据可缓存在 Buffer Pool不支持系统表空间
索引也被压缩,提升查询性能配置稍复杂(需设置 KEY_BLOCK_SIZE
适合 SSD 存储压缩率取决于数据内容(文本高,二进制低)

六、表压缩 vs 页压缩(透明压缩)—— 你应该用哪个?

特性表压缩(Table Compression)页压缩(Page Compression)
MySQL 版本5.7+8.0.20+
启用方式ROW_FORMAT=COMPRESSEDCOMPRESSION="zstd"
压缩算法zlibzlib, lz4, zstd
性能一般更好(尤其写性能)
透明性较低高(几乎透明)
推荐程度❌ 老项目兼容✅ 新项目首选

建议


✅ 总结:关键要点

要点说明
表压缩是 InnoDB 的一种页级压缩技术
支持条件必须是 file_per_table通用表空间
启用方式ROW_FORMAT=COMPRESSED + KEY_BLOCK_SIZE
压缩算法zlib
监控工具INFORMATION_SCHEMA.INNODB_CMP
适合场景大表、SSD、读多写少、归档数据
注意事项增加 CPU 开销,不支持系统表空间
新项目建议使用更现代的 页压缩(COMPRESSION)

一句话建议

如果你在维护一个老系统,或者必须使用 ROW_FORMAT,可以使用 InnoDB 表压缩;但如果是新项目,强烈建议直接使用 MySQL 8.0 的 透明页压缩(COMPRESSION="zstd",更简单、更高效。

需要我帮你写一个脚本,自动分析哪些表适合启用压缩吗?

http://www.jsqmd.com/news/6861/

相关文章:

  • 背单词 纯英文 2025年10月
  • 英语背单词 专八词汇 中英对照 2025年10月
  • 「Diary Solution Set」October 2025 在凉雨停歇的那天
  • MaopaiJD Esp8266 代码
  • 英语_错题集_25-10
  • Ynoi Easy Round 2015 学习笔记
  • 详细介绍:《红色脉络:一部PLMN在中国的演进史诗 (1G-6G)》 第11篇 | 核心网演进终局:从EPC到5GC——微服务与“云原生”
  • Esp8266
  • 实用指南:Postman 学习笔记 III:CLI 自动化测试与 Jenkins CI/CD 实践
  • 完整教程:渗透技巧403绕过
  • 公民科学研究奖项众人智慧表彰技术创新项目
  • 深入解析:@xyflow/react:构建交互式节点流程图的完整指南
  • 1数学建模模型分类
  • 数学每日?题
  • OpenSpeedy最新版下载,夸克百度网盘加速提速|游戏加速工具|官网入口
  • 详细介绍:深入理解 SPI:从定义到 Spring Boot 实践
  • RVC WebUI(Retrieval-based-Voice-Conversion-WebUI)配置 - 实践
  • 第一次软工作业
  • Nginx核心配备详解:访问控制、用户认证与HTTPS部署
  • 深入解析:5. Prompt 提示词
  • 基于Python+Vue开发的婚恋交友管理系统源码+运行步骤
  • 详细介绍:Python 编辑器:PyCharm
  • 2025 年搅拌机设备厂家 TOP 企业品牌推荐排行榜,盘点磁混凝系统 / 发酵罐 / 刮泥机 / 推进式 / 脱硫侧搅拌机公司推荐!
  • 福州市 2025 国庆集训 Day1 前三题题解
  • Python常用数据类型详解:字符串、列表、字典全解析
  • 【自学笔记】Redis 飞快入门
  • 强连通,Tarjan,缩点
  • 实用指南:K8s日志架构:Sidecar容器实践指南
  • Python方案--交互式VR教育应用开发
  • 纯Qt代码实现onvif协议设备端/onvif设备模拟器/onvif虚拟监控设备/桌面转onvif