13 | 为什么表数据删掉一半,表文件大小不变?

这里,我们还是针对 MySQL 中应用最广泛的 InnoDB 引擎展开讨论。一个 InnoDB 表包含两部分,即:表结构定义和数据。在 MySQL 8.0 版本以前,表结构是存在以.frm 为后缀的文件里。而 MySQL 8.0 版本,则已经允许把表结构定义放在系统数据表中了。因为表结构定义占用的空间很小,所以我们今天主要讨论的是表数据。

此命令会锁表要注意在没有业务的时候执行:alter table A engine=InnoDB

使用 optimize table、analyze table 和 alter table 这三种方式重建表的区别。

1、从 MySQL 5.6 版本开始,alter table t engine = InnoDB(也就是 recreate)默认的就是上面图 4 的流程了;

2、analyze table t 其实不是重建表,只是对表的索引信息做重新统计,没有修改数据,这个过程中加了 MDL 读锁;

3、optimize table t 等于 recreate+analyze。

现在你已经知道了,如果要收缩一个表,只是 delete 掉表里面不用的数据的话,表文件的大小是不会变的,你还要通过 alter table 命令重建表,才能达到表文件变小的目的。我跟你介绍了重建表的两种实现方式,Online DDL 的方式是可以考虑在业务低峰期使用的,而 MySQL 5.5 及之前的版本,这个命令是会阻塞 DML 的,这个你需要特别小心。


什么时候使用 alter table t engine=InnoDB 会让一个表占用的空间反而变大?

1、在这篇文章的评论区里面,大家都提到了一个点,就是这个表,本身就已经没有空洞的了,比如说刚刚做过一次重建表操作。

2、在 DDL 期间,如果刚好有外部的 DML 在执行,这期间可能会引入一些新的空洞。


感谢极客时间:https://time.geekbang.org/column/article/72388

你可能感兴趣的:(13 | 为什么表数据删掉一半,表文件大小不变?)