一、数据删除流程

数据页的复用跟记录的复用是不同的。
记录的复用,只限于符合范围条件的数据。
而当整个页从 B+ 树里面摘掉以后,可以复用到任何位置。

如果相邻的两个数据页利用率都很小,系统就会把这两个页上的数据合到其中一个页上,另外一个数据页就被标记为可复用。

delete 命令其实只是把记录的位置,或者数据页标记为了“可复用”,但磁盘文件的大小是不会变的。

不止是删除数据会造成空洞,插入数据也会。

二、重建表

MySQL 5.6 版本开始引入的 Online DDL

Online 和 inplace

DDL 过程如果是 Online 的,就一定是 inplace 的;
反过来未必,也就是说 inplace 的 DDL,有可能不是 Online 的。

三、小结

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