删除表
表数据既可以存储在共享表空间内,也可以是单独的文件。这个行为是由参数 innodb_file_per_table 控制的,它只有两种状态,使用 show variable like 'innodb_file_per_table' 命令查询。
- OFF:存储在共享表空间,也就是跟数据字典放在一起。
- ON:每个 InnoDB 表数据存储在一个以
.ibd为后缀的文件中。
从MySQL 5.6.6 开始,默认值为 ON。
ON 的状态下,drop table 命令直接回收表空间。
删除行数据
如果记录被 delete 之后,不会马上回收其空间,可能会被复用。
另外,更新索引上的值,可以理解为删除一个旧的值,再插入一个新值。
重建表
delete 之后的空间可能会被复用,也可能不会复用,取决于主键是否为递增序列。
为了彻底解决这些空洞数据,我们可以使用 alter table A engine=InnoDB 这个命令来重建表。MySQL 会自动完成转存数据、交换表明、删除旧表的操作。
