总结:记一次Mysql表碎片清理

本文探讨了MySQL数据库中数据表为何占用大量空间,重点在于数据表碎片的形成、影响及如何通过分析InnoDB数据和索引、信息_schema表来定位问题。特别提到noticelog和handle表的大量碎片,并解释了删除操作导致的碎片积累和其对性能的影响。

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

一、背景

一天,观察到线程DB占用了超过1T的空间,但是show table status from mc查看,所有表加起来也只不过是300G左右,远没有1T,于是想探个究竟。

二、分析

分析一:让DBA帮看下,binlog占用了81G,innodata占用16G,innolog占用6G,主要还是data占用了930G,还是要看下为什么data这么大

分析二:各个表占用的总大小

分析三: select table_name,Data_length,Index_length,data_free from information_schema.tables where table_schema='mc' order by data_free desc;

通过以上命令可以看数据大小,各个字段含义:

Data_length:表存储的数据大小

Index_length:索引大小

data_free :碎片大小(其实就是delete数据导致索引空间没释放,从而产生碎片,参考: MySQL表的碎片整理和空间回收小结 - 潇湘隐者 - 博客园

执行sql可知,noticelog和handle两个表的碎片分别达到了203G和44G,碎片会影响查询效率,所以需要定期清理

三、表碎片产生原因

经常进行 delete 操作,产生空白空间,如果进行新的插入操作,MySQL将尝试利用这些留空的区域,但仍然无法将其彻底占用,久而久之就产生了碎片;

简单理解就是,原来一条记录是10KB,被删除后,变成空白空间,这个空间不会回收,新数据会插入到这个空白空间,但是如果新数据是2KB,相当于8KB的空间被浪费了,这8KB的空间就是碎片。

当删除的数据多了就会产生碎片。

四、碎片的影响

1、占用空间:如上mc_noticelog表的碎片占用了超过了200G的空间。

2、对性能的影响:性能影响不大,但是对于查询操作,需要扫描的是所有空间,会有一点影响,下面是网络上摘录的一句话

一个表有1万行,每行10字节,会占用10万字节存储空间,执行删除操作,只留一行,实际内容只剩下10字节,但MySQL在读取时,仍看做是10万字节的表进行处理,所以,碎片越多,就会越来越影响查询性能。

### 如何清理 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)操作也是很重要的方面之一。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值