MySQL压缩表创建方法示例详解

 更新时间:2025年09月28日 09:32:47   作者:lang20150928  
本文给大家介绍MySQL压缩表创建方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

这段内容是 MySQL 官方文档 17.9.1.2 节:创建压缩表(Creating Compressed Tables),它详细说明了如何在两种不同类型的表空间中创建 InnoDB 压缩表,并解释了相关的语法、限制和注意事项。

我们来一步步拆解、翻译并通俗化讲解,让你彻底理解:

✅ 如何正确创建一个压缩表
⚠️ 需要注意哪些坑
🔧 各参数的含义与关系

🎯 一句话总结

你可以通过 ROW_FORMAT=COMPRESSEDKEY_BLOCK_SIZE独立表空间(file-per-table)通用表空间(general tablespace) 中创建压缩表,但 不能在系统表空间中使用压缩。两者配置方式略有不同,尤其是通用表空间需要预先定义 FILE_BLOCK_SIZE

📁 一、支持压缩的表空间类型回顾

表空间类型是否支持压缩说明
✅ 文件独立表空间(.ibd 文件)每个表一个文件,默认开启
✅ 通用表空间(General Tablespace)多个表共享一个 .ibd 文件
❌ 系统表空间(ibdata1包含系统数据(如 undo log),不支持压缩

📌 所以:只要你的表不是放在 ibdata1 里,就可以压缩。

🛠️ 二、方法一:在“独立表空间”中创建压缩表

✅ 前提条件:

  • innodb_file_per_table=ON(默认就是 ON)
SET GLOBAL innodb_file_per_table = 1; -- 可选:确保启用(通常已默认)

✅ 创建语句:

CREATE TABLE t1 (
  c1 INT PRIMARY KEY
) 
ROW_FORMAT = COMPRESSED 
KEY_BLOCK_SIZE = 8;

🔍 参数说明:

参数作用
ROW_FORMAT=COMPRESSED明确启用压缩
KEY_BLOCK_SIZE=8目标压缩页大小为 8KB(单位是 KB)

💡 实际磁盘上的页会被压缩到接近这个大小(如原始 16KB → 压缩成 ~8KB)

🧱 三、方法二:在“通用表空间”中创建压缩表

这是重点,比独立表空间复杂一些。

✅ 步骤 1:先创建通用表空间,指定FILE_BLOCK_SIZE

CREATE TABLESPACE `ts2` 
ADD DATAFILE 'ts2.ibd' 
FILE_BLOCK_SIZE = 8192 
ENGINE=InnoDB;
  • FILE_BLOCK_SIZE = 8192:表示这个表空间的 物理块大小是 8KB
  • 单位是 字节(注意!和 KEY_BLOCK_SIZE 不同)

✅ 步骤 2:创建表时,KEY_BLOCK_SIZE必须匹配

CREATE TABLE t4 (
  c1 INT PRIMARY KEY
) 
TABLESPACE ts2 
ROW_FORMAT = COMPRESSED 
KEY_BLOCK_SIZE = 8;  -- 8192 字节 = 8KB

🔗 关键规则:

KEY_BLOCK_SIZE(单位 KB)必须等于 FILE_BLOCK_SIZE / 1024

innodb_page_sizeFILE_BLOCK_SIZEKEY_BLOCK_SIZE
16384 (16KB)8192 (8KB)8
1638440964
1638420482

❌ 如果不匹配?→ 报错!

📝 四、重要注意事项(Notes)

1️⃣ MySQL 8.0 起:压缩表空间文件更小

“The tablespace file for a compressed table is created using the physical page size…”

  • 以前:空压缩表也占满 16KB 一页
  • 现在:直接按压缩后的大小分配空间 → 初始 .ibd 文件更小

✅ 好处:节省空间,启动更快

2️⃣ROW_FORMAT=COMPRESSED和KEY_BLOCK_SIZE可以互相推导

你写的实际效果
ROW_FORMAT=COMPRESSED(无 KEY_BLOCK_SIZE自动设为 innodb_page_size / 2 → 通常是 8KB
KEY_BLOCK_SIZE=4(无 ROW_FORMAT自动启用压缩

📌 所以这两个参数写一个就行,另一个可省略。

3️⃣ 如何选择最佳KEY_BLOCK_SIZE?

文档建议:

“typically you create several copies of the same table with different values… then measure performance”

✅ 推荐做法:

  1. 创建多个副本:KEY_BLOCK_SIZE=8, 4, 2
  2. 导入真实数据
  3. 测量:
    • .ibd 文件大小
    • 查询性能(TPS/QPS)
    • CPU 使用率
  4. 选择综合最优值

📌 经验值:

  • 大多数场景用 8 就很好
  • 数据特别大或 SSD 成本敏感 → 尝试 42

4️⃣KEY_BLOCK_SIZE是“提示”,不是强制

  • InnoDB 可能根据实际情况调整
  • 如果设得太大(> innodb_page_size)→ 忽略,警告,自动改为一半
  • 如果 innodb_strict_mode=ON(默认)→ 直接报错

5️⃣ 大页(32KB/64KB)不支持压缩!

“InnoDB supports 32KB and 64KB page sizes but these do not support compression.”

  • innodb_page_size=3276865536 → 无法使用压缩
  • 所以想用压缩,必须保持 innodb_page_size ≤ 16KB

6️⃣ 设置KEY_BLOCK_SIZE = 16有意义吗?

  • 对于独立表空间:

    • KEY_BLOCK_SIZE=16 → 通常压缩率很低(因为原始页就是 16KB)
    • 但对 包含大量 BLOB/TEXT 的表 仍可能有效,因为这些字段会存到“溢出页”(off-page),压缩后可减少溢出页数量
  • 对于通用表空间:

    • 不允许 KEY_BLOCK_SIZE = innodb_page_size
    • 必须小于原始页大小

7️⃣ 所有索引都会被压缩

“All indexes of a table… are compressed using the same page size”

  • 主键(聚簇索引)、二级索引、唯一索引 → 全部压缩
  • 压缩是 整表级别 的,不是按行或按索引设置
  • CREATE INDEX 时不支持指定压缩参数(会被忽略)

🚫 五、压缩表的限制(Restrictions)

限制说明
❌ 不能在系统表空间中压缩ibdata1 不支持
❌ 通用表空间内不能混用压缩和非压缩表要么全压缩,要么全不压缩
❌ 不支持压缩临时表CREATE TEMPORARY TABLE ... COMPRESSED → 报错或自动转为非压缩
❌ 压缩是整表行为不能只压缩某几列或某几个索引
CREATE INDEX 不支持压缩语法但继承表的压缩设置

🧩 六、参数对比表(关键区别)

参数出现场景单位示例说明
innodb_page_size全局配置字节16384内存中的原始页大小(默认 16KB)
KEY_BLOCK_SIZECREATE TABLEKB8目标压缩页大小(KB)
FILE_BLOCK_SIZECREATE TABLESPACE字节8192通用表空间的物理块大小

📌 记住:KEY_BLOCK_SIZE = FILE_BLOCK_SIZE / 1024

✅ 七、完整示例:推荐做法

场景:在通用表空间中创建压缩表

-- 1. 创建通用表空间(8KB 物理块)
CREATE TABLESPACE `compressed_ts` 
ADD DATAFILE 'compressed_ts.ibd' 
FILE_BLOCK_SIZE = 8192 
ENGINE=InnoDB;
-- 2. 创建压缩表(KEY_BLOCK_SIZE=8)
CREATE TABLE sales_archive (
  id BIGINT AUTO_INCREMENT PRIMARY KEY,
  product VARCHAR(100),
  amount DECIMAL(10,2),
  created_date DATE
) TABLESPACE compressed_ts 
  KEY_BLOCK_SIZE = 8;  -- ROW_FORMAT=COMPRESSED 自动启用

✅ 总结:关键要点

要点说明
✅ 支持压缩的表空间file-per-tablegeneral tablespace
❌ 不支持系统表空间、临时表
🔧 启用方式ROW_FORMAT=COMPRESSEDKEY_BLOCK_SIZE=N
📏 KEY_BLOCK_SIZE目标压缩页大小(KB),常用 8/4/2
🧱 通用表空间必须先设 FILE_BLOCK_SIZE(字节),且 KEY_BLOCK_SIZE = FILE_BLOCK_SIZE/1024
🔄 参数互推写一个,另一个可自动推导
📊 最佳实践测试不同 KEY_BLOCK_SIZE,选择最优
⚠️ 注意大页(32KB/64KB)不支持压缩

💡 一句话建议

如果你是普通用户,直接用 独立表空间 + KEY_BLOCK_SIZE=8 就够了;如果是 DBA 管理多个大表,可以考虑 通用表空间 + 统一压缩策略,但要严格遵守 FILE_BLOCK_SIZEKEY_BLOCK_SIZE 的匹配规则。

到此这篇关于MySQL压缩表创建指南的文章就介绍到这了,更多相关mysql压缩表创建内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • mysql约束和高级sql详解

    mysql约束和高级sql详解

    文章介绍了MySQL中的约束类型(如主键、外键、唯一约束、非空约束、检查约束、默认值和自增)以及高级SQL功能(如子查询、连接、事务和存储过程),感兴趣的朋友一起看看吧
    2024-11-11
  • 重置MySQL中表中自增列的初始值的实现方法

    重置MySQL中表中自增列的初始值的实现方法

    这篇文章主要介绍了重置MySQL中表中自增列的初始值的实现方法的相关资料,需要的朋友可以参考下
    2017-03-03
  • mysql explain中key_len的含义以及计算方法

    mysql explain中key_len的含义以及计算方法

    通常在优化SQL查询的时候,我们都会使用explain分析SQL执行计划,下面这篇文章主要给大家介绍了关于mysql explain中key_len的含义以及计算方法的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-03-03
  • Mysql分区表和普通表互转的实现示例

    Mysql分区表和普通表互转的实现示例

    本文主要介绍了Mysql分区表和普通表互转的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-02-02
  • MySQL数据库基础入门之常用命令小结

    MySQL数据库基础入门之常用命令小结

    这篇文章主要介绍了MySQL数据库基础入门之常用命令,结合实例形式分析了MySQL数据库管理、备份、日志常用操作命令与使用注意事项,需要的朋友可以参考下
    2020-05-05
  • MySQL中的常用函数及用法总结

    MySQL中的常用函数及用法总结

    MySQL是一种常用的关系型数据库管理系统,它提供了许多内置函数来处理数据,本文将介绍MySQL中的各种常用函数,包括字符串函数、日期函数、数学函数、聚合函数等,需要的朋友可以参考下
    2023-06-06
  • mysql 5.6.21 安装与配置详细步骤

    mysql 5.6.21 安装与配置详细步骤

    这篇文章主要介绍了mysql5.6.21安装与配置的详细步骤,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  • 了解MySQL之Adaptive Hash Index的使用

    了解MySQL之Adaptive Hash Index的使用

    InnoDB的自适应哈希索引(AHI)是内存结构,自动优化等值查询,不支持排序,通过缓存热点数据提升效率,参数可调整,适用于特定场景
    2025-08-08
  • mysql中key 、primary key 、unique key 与index区别

    mysql中key 、primary key 、unique key 与index区别

    这篇文章主要介绍了mysql中key 、primary key 、unique key 与index区别的相关资料,需要的朋友可以参考下
    2016-10-10
  • SQL查询至少连续n天登录的用户

    SQL查询至少连续n天登录的用户

    这篇文章介绍了SQL查询至少连续n天登录用户的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-01-01

最新评论