day-13-为什么表数据删掉一半,表文件大小不变
一、数据删除流程
数据页的复用跟记录的复用是不同的。
记录的复用,只限于符合范围条件的数据。
而当整个页从 B+ 树里面摘掉以后,可以复用到任何位置。
如果相邻的两个数据页利用率都很小,系统就会把这两个页上的数据合到其中一个页上,另外一个数据页就被标记为可复用。
delete 命令其实只是把记录的位置,或者数据页标记为了“可复用”,但磁盘文件的大小是不会变的。
不止是删除数据会造成空洞,插入数据也会。
二、重建表
MySQL 5.6 版本开始引入的 Online DDL
Online 和 inplace
DDL 过程如果是 Online 的,就一定是 inplace 的;
反过来未必,也就是说 inplace 的 DDL,有可能不是 Online 的。
三、小结
如果要收缩一个表,只是 delete 掉表里面不用的数据的话,表文件的大小是不会变的,还要通过 alter table 命令重建表,才能达到表文件变小的目的。重建表有两种实现方式,Online DDL 的方式是可以考虑在业务低峰期使用的,而 MySQL 5.5 及之前的版本,这个命令是会阻塞 DML 的,这个需要特别小心。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 张晓风的博客!
评论