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

 

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

也就是说,通过 delete 命令是不能回收表空间的。

这些可以复用,而没有被使用的空间,看起来就像是“空洞”。

 

不止是删除数据会造成空洞,插入数据也会。如果数据是按照索引递增顺序插入的,那么索引是紧凑的。

但如果数据是随机插入的,就可能造成索引的数据页分裂。

经过大量增删改的表,都是可能是存在空洞的。所以,如果能够把这些空洞去掉,就能达到收缩表空间的目的。

而重建表,就可以达到这样的目的。

可以使用 alter table A engine=InnoDB 命令来重建表

 

 DDL 过程如果是 Online 的,就一定是 inplace 的;

反过来未必,也就是说 inplace 的 DDL,有可能不是 Online 的。

截止到 MySQL 8.0,添加全文索引(FULLTEXT index)和空间索引 (SPATIAL index) 就属于这种情况。

optimize table、analyze table 和 alter table 这三种方式重建表的区别。这里,我顺便再简单和你解释一下。
从 MySQL 5.6 版本开始,alter table t engine = InnoDB(也就是 recreate)默认的就是上面图 4 的流程了;
analyze table t 其实不是重建表,只是对表的索引信息做重新统计,没有修改数据,这个过程中加了 MDL 读锁;
optimize table t 等于 recreate+analyze。

 

posted @ 2020-02-01 12:32  lakeslove  阅读(170)  评论(0编辑  收藏  举报