delete操作

使用delete删除的时候,MySQL并没有把数据文件删除,只会将已经删除的数据标记为删除,因此并不会彻底的释放空间。这些被删除的数据会被保存在一个链接清单中,当有新数据写入的时候,MySQL会利用这些已删除的空间再写入。删除操作会带来一些数据碎片,正是这些碎片在占用硬盘空间。这些被标记为删除的记录,就是数据空洞。不仅浪费空间,还影响查询效率。

直接操作

这是 case,千万别干,干了就准备滚蛋

drop table table_name;
truncate table table_name;

优化方法

1、第一种方法

optimize table table_name ;

OPTIMIZE 适用于InnoDB和MyISAM存储引擎。 使用OPTIMIZE TABLE来重新利用未使用的空间,并重新整理数据文件的碎片。

好处:减少表数据与表索引的物理空间,降低访问表时的IO。整理之前,取数据需要跨越很多碎片空间,这时需要时间的,整理后,想要的数据都放在一起了,直接拿就拿到了,效率提高。

2、第二种方法

alter table tab_name  ENGINE = 'InnoDB';

注意:该操作执行的时候会把该表格先写入一个tmp临时表,所以磁盘剩余空间必须大于表空间,否则会执行失败。

3、第三种方法(生产环境不建议使用)

先将整个表的结构和数据导出来,删除整个表,再创建表,最后将旧表数据重新导入新表中。

考虑问题:

实例剩余可用空间至少是需回收表的物理空间的3倍。(缩容前要留出 1 倍当前表空间中台给的建议,阿里云更靠谱)