【请关注】MySQL 碎片整理提升性能
MySQL 碎片整理的具体操作样例:
1.备份数据:碎片整理可能伴随锁表或数据移动,操作前务必备份。
2.锁表影响:OPTIMIZE TABLE 对 InnoDB 表会触发 MDL 锁,大表需谨慎。
3.日志清理:整理后建议清理二进制日志(PURGE BINARY LOGS)或重启 MySQL,释放磁盘空间。
- InnoDB 表空间碎片整理
假设存在一张名为 table_test 的表,因频繁增删导致碎片较多,需优化表空间。
- 使用 OPTIMIZE TABLE 整理(简单场景)
sql
OPTIMIZE TABLE table_test;
-作用:重组表数据,回收未使用空间,适用于中小型表。
-注意:会锁定表,生产环境建议在低峰期执行。
2. 重建表+删除临时文件(避免锁表)
sql
-- 方法1:通过 CREATE...SELECT 重建(适用于非分区表)
CREATE TABLE table_test_new LIKE table_test;
INSERT INTO table_test_new SELECT FROM table_test;
RENAME TABLE table_test TO table_test_old, table_test_new TO table_test;
DROP TABLE table_test_old;
-- 方法2:使用 ALTER TABLE 重建(自动处理临时表)
ALTER TABLE table_test ENGINE = InnoDB;
-作用:通过新建表转移数据,释放碎片空间,锁表时间更短。
3.场景:MyISAM 表碎片整理
MyISAM 表碎片更常见,需定期优化。
1. 直接优化表
sql
OPTIMIZE TABLE table_test;
-效果:会立即整理碎片,恢复表空间。
2. 批量优化多个表
sql
-- 查询需要优化的表(数据长度 + 索引长度 > 数据文件长度)
SELECT TABLE_SCHEMA, TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE ENGINE = 'MyISAM'
AND (DATA_LENGTH + INDEX_LENGTH) > DATA_FREE;
-- 生成优化语句(批量执行)
SELECT CONCAT('OPTIMIZE TABLE ', TABLE_SCHEMA, '.', TABLE_NAME, ';')
FROM INFORMATION_SCHEMA.TABLES
WHERE ENGINE = 'MyISAM'
AND DATA_FREE > 0;
通过以上方法可有效减少表空间碎片,提升查询性能。根据表引擎和数据量选择合适方式,优先避免对生产环境造成影响。