【mysql系】表碎片清理

文章介绍了如何检查MySQL数据库中的表碎片,以及针对数据碎片过大(超过50M)的表进行清理的方法,包括使用ALTERTABLE命令切换存储引擎来整理碎片。同时提醒在业务低峰期执行此类操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当然如果生产环境环境表是做过分区的且是根据分区维度做删除的,可以使用交互分区到普通表,或者删除对应分区drop partition,也是会释放空间的

查看有碎片的表

SELECT
	table_schema db,
	table_name,
	data_free,
ENGINE 
FROM
	information_schema.TABLES 
WHERE
	table_schema NOT IN ( 'information_schema', 'mysql' ) 
	AND data_free > 0;

查询结果出来 data_free列的值就是对应的碎片大小

查看日常表空间大小大于50M的表的脚本

SELECT
	CONCAT( table_schema, '.', table_name ) AS 表名,
	ENGINE AS 表存储引擎,
	table_type AS 表类型,
	table_rows AS 行数,
	CONCAT( ROUND( data_length / ( 1024 * 1024 ), 2 ), 'M' ) AS 数据大小,
	CONCAT( ROUND( index_length / ( 1024 * 1024 ), 2 ), 'M' ) AS 索引大小,
CASE
		
		WHEN data_length = 0 THEN
		0 ELSE ROUND( index_length / data_length, 2 ) 
	END AS 索引占比,
	CONCAT( ROUND( data_free / 1024 / 1024, 2 ), 'MB' ) AS 空闲大小,
CASE
		
		WHEN ( data_length + index_length ) = 0 THEN
		0 ELSE ROUND( data_free /( data_length + index_length ), 2 ) 
	END AS 空闲占比 
FROM
	information_schema.TABLES 
WHERE
	ROUND( DATA_FREE / 1024 / 1024, 2 ) >= 50 
	and table_schema NOT IN ( 'information_schema', 'mysql' )  
ORDER BY
	data_free DESC;

对应表进行做碎片整理的sql脚本(推荐使用)

这里需要注意生产环境切记在业务高峰期操作执行该语句

alter table 表名  engine=innodb;

### 如何清理 MySQL 索引碎片的最佳实践 #### 了解索引碎片及其影响 索引碎片是指由于频繁的插入、更新和删除操作,导致数据库中的数据页不再连续存储的现象。这会降低查询性能并增加磁盘I/O开销。avg_fragmentation_in_percent列展示了堆或索引的碎片水平[^2]。 #### 清理索引碎片的方法 ##### 对于 InnoDB 对于 InnoDB 存储引擎来说,可以通过OPTIMIZE TABLE命令来重组结构从而减少碎片化: ```sql OPTIMIZE TABLE table_name; ``` 该命令实际上执行了如下三个动作: - 创建一个新的临时并将原的数据复制过去; - 构建新的索引; - 删除旧并重命名新为原来的名称; 这种方法可以有效地消除物理上的碎片,并重建所有的辅助索引以提高访问效率。不过需要注意的是,在高并发环境下运行此命令可能会引起短暂的服务中断,因此建议在低峰期进行维护工作。 另外一种方式是在 ALTER TABLE 的基础上加上 ALGORITHM=COPY 参数来进行在线DDL变更: ```sql ALTER TABLE table_name ENGINE=InnoDB, ALGORITHM=COPY; ``` 这种方式同样能够达到整理空间的效果而且支持更多的选项控制。 ##### 对于 MyISAM MyISAM 类型则可以直接利用 OPTIMIZE TABLE 或者 REPAIR TABLE 来修复损坏及优化结构: ```sql REPAIR TABLE table_name QUICK; -- 只针对非致命错误做快速修复 OPTIMIZE TABLE table_name; ``` 以上两种方法都可以很好地解决MyISAM中存在的碎片问题。 #### 定期监控与预防措施 为了防止过多的碎片积累,应该定期检查数据库健康状况并通过上述手段及时处理潜在隐患。同时合理规划业务逻辑尽量避免不必要的DML(DatA Manipulation Language)操作也是很重要的方面之一。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值