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。