MySQL 清除表碎片空间

Posted 一宿君

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL 清除表碎片空间相关的知识,希望对你有一定的参考价值。

目录

啥情况

事情是这样的,正在努力敲代码中(摸鱼),突然 DBA 来了一张截图

说这表是不是我的,我愣了好几秒,有点熟悉但不敢直接说是我的,然后我就去查,果然不是我的,但是数据好像是我不小心同步的,这锅是我的,然后说赶紧清理下碎片空间,数据库都快被这张表干崩球了!!!

然后我就去扒拉啥是碎片空间~

为什么会产生碎片空间

mysql 数据在运行过程中,业务对数据表不断的进行增删改查操作,时间长后会导致数据表表空间碎片率较高,在重整表空间前这些碎片空间无法使用,造成磁盘空间使用率低,容易导致磁盘配置限额。

详情原因:

  • 数据库表每当 delete 删除一行数据时,该段空间就会变为空白,被留空,而在一段时间内的大量删除表操作,会使这种被留白的空间变得比存储数据内容占用的空间还要大。
  • 当执行插入数据操作时,MySQL 会尝试使用空白空间,但是如果某个留白空间一直没有被大小合适的数据占用,或者无法将其彻底的占用,时间久了就形成了碎片空间。
  • 当 MySQL 扫描表数据的时候,它扫描的实际上是当前表容量的上线值(最大值),也就是数据被写入区域中处于峰值位置的部分。

举个例子:

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

查看碎片空间大小

查看某个表的碎片空间大小

show table status like '表名';


查看某个数据中所有表的碎片空间倒序排序

SELECT table_schema,table_name,ROUND(((index_length+data_length)/1024/1024/1024),2) AS '表空间GB', ROUND((data_free/1024/1024/1024),2) AS '碎片GB' FROM information_schema.`TABLES`
WHERE table_schema != 'information_schema' AND table_schema = '数据库名'
ORDER BY index_length+data_length+data_free DESC

清除碎片空间

根据存储引擎不同,清理方式也不同。

如果是 MyIASM 存储引擎:

optimize table 表名

如果是 InnoDB 存储引擎:

alter table 表名 engine=InnoDB

清除碎片空间

alter table dws_sto_ads_cost_profit_analysis_prov_analysis_region_split engine=InnoDB;

这个过程可能会很长,耐心等待!!!

再次查询如下:

清除碎片空间操作会暂时锁表,数据量越大,耗费的时间越长,可以做个脚本,定期在访问低谷时间执行,检查 data_free 字段,大于预警值的话,就清理一次。



一起学编程,让生活更随和!

如果你觉得是个同道中人,欢迎关注博主gzh:【随和的皮蛋桑】。

专注于Java基础、进阶、面试以及计算机基础知识分享🐳。偶尔认知思考、日常水文🐌。


以上是关于MySQL 清除表碎片空间的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 清除表空间碎片

MySQL 清除表碎片空间

MySQL 清除表空间碎片

小白学习MySQL - 表空间碎片整理方法

MySQL 处理某个idb表文件过大

MySQL 处理某个idb表文件过大