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基础、进阶、面试以及计算机基础知识分享🐳。偶尔认知思考、日常水文🐌。

在这里插入图片描述


评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一宿君

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值