0

0

mysql如何优化表空间碎片回收_mysql文件瘦身与并发性能

P粉602998670

P粉602998670

发布时间:2026-03-13 12:28:03

|

867人浏览过

|

来源于php中文网

原创

ALTER TABLE ... ENGINE=InnoDB 不释放磁盘空间是正常行为,因仅整理页内碎片而不归还空闲空间给操作系统,需满足无长事务、innodb_file_per_table=ON等条件才可能收缩ibd文件。

mysql如何优化表空间碎片回收_mysql文件瘦身与并发性能

ALTER TABLE ... ENGINE=InnoDB 为什么没真正释放磁盘空间

执行 ALTER TABLE t ENGINE=InnoDB 后,ibd 文件大小几乎不变——这不是 bug,是 InnoDB 的正常行为。它只是重建表、整理页内碎片,但不会把空闲空间还给操作系统,除非满足特定条件。

  • 必须确保表没有长事务、未提交的 XA 事务或活跃的只读事务,否则 purge 线程无法清理 undo 日志,进而阻塞空间回收
  • innodb_file_per_table=ON 是前提(MySQL 5.6+ 默认开启),否则所有表共用系统表空间,根本没法单独瘦身
  • 执行后需等待 INFORMATION_SCHEMA.INNODB_METRICS 中的 buffer_pool_pages_free 显著上升,且磁盘上 ls -lh table.ibd 大小才可能下降
  • 若仍不缩,大概率是 undo log 或 change buffer 占着空间没释放,不是表本身的问题

OPTIMIZE TABLE 在高并发写入时会锁表多久

OPTIMIZE TABLE 在 MySQL 5.7+(含 8.0)对 InnoDB 表默认走 ALGORITHM=INPLACE,但「不锁表」是假象:它仍需获取 S(共享)MDL 锁,在 DDL 开始和结束各一次,中间阶段允许 SELECT/INSERT/UPDATE/DELETE,但遇到 DML 冲突会排队。

  • 真实瓶颈常在 copy 阶段的 I/O 和 buffer pool 压力——大量页读入 + 重写,易触发 Buffer pool hit rate 下降,连带拖慢其他查询
  • 如果表上有全文索引、虚拟列或外键约束,OPTIMIZE 会自动退化为 COPY 算法,全程加 X(排他)MDL 锁,等同于锁表
  • 线上建议用 pt-online-schema-change --alter="ENGINE=InnoDB" 替代,它能控制 chunk 大小和 sleep 时间,把影响摊薄

如何判断某张表是否真需要碎片回收

别看 Data_free 字段就动手——SHOW TABLE STATUS LIKE 't' 返回的 Data_free 是分配给该表但未使用的空间(单位字节),但它可能被 change buffer、undo log 或临时段占用,不代表可立即回收。

PathFinder
PathFinder

AI驱动的销售漏斗分析工具

下载
  • 先查 SELECT DATA_LENGTH, DATA_FREE, TABLE_ROWS FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME='t',若 DATA_FREE / DATA_LENGTH > 0.3 且表长期有 DELETE/UPDATE,才值得介入
  • 更准的方法是对比 innodb_buffer_pool_pages_datainnodb_buffer_pool_pages_total,如果前者远小于后者但 ibd 文件巨大,说明很多页是“逻辑空闲但物理未归还”
  • innochecksum -v table.ibd | grep "fill factor"(需停机)看页填充率,低于 60% 才算严重碎片

TRUNCATE + INSERT 比 OPTIMIZE 更快但风险在哪

对冷表或可接受短时不可写场景,CREATE TABLE t_new AS SELECT * FROM t; DROP TABLE t; ALTER TABLE t_new RENAME TO t; 确实比 OPTIMIZE 快,因为跳过了 undo log 和 MVCC 版本链重建,但代价明确:

  • 自增 ID 重置——如果业务依赖连续或单调递增的主键,这会导致下游同步异常或唯一键冲突
  • 丢失表级元数据:如 COMMENTROW_FORMATKEY_BLOCK_SIZE 不会自动继承,必须显式指定 CREATE TABLE t_new LIKE tINSERT INTO t_new SELECT * FROM t
  • 触发器、外键约束、分区定义全部失效,需人工重建;而 OPTIMIZE 保留全部 DDL 元信息
  • 如果表有 GENERATED COLUMNJSON 字段,SELECT * 可能因隐式类型转换导致数据截断,务必验证

碎片回收不是“越勤越好”,InnoDB 的页分裂和合并本来就是常态。真正卡顿往往来自 buffer pool 不足、I/O 调度策略不当,或是单个大事务拖住 purge。先看 SHOW ENGINE INNODB STATUS\G 里的 History list lengthLOG 段,再决定动不动表空间。

相关文章

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

686

2023.06.20

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

513

2023.06.21

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

287

2023.07.18

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

519

2023.07.19

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

267

2023.07.25

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

392

2023.08.08

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

542

2023.08.11

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

668

2023.08.14

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

3

2026.03.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 2.5万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 850人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号