14.12.5 使用 TRUNCATE TABLE 回收磁盘空间

要在truncating一个InnoDBtable 时回收 os 磁盘空间,该 table 必须存储在其自己的.ibd文件中。若要将 table 存储在其自己的.ibd文件中,必须在创建 table 时启用innodb_file_per_table。此外,被截断的 table 和其他 table 之间不能有foreign key约束,否则TRUNCATE TABLE操作将失败。但是,允许在同一 table 的两列之间使用外键约束。

当 table 被截断时,将其删除并在新的.ibd文件中重新创建,并将释放的空间返回给 os。这与截断InnoDB system tablespace中存储的InnoDBtable(在innodb_file_per_table=OFF时创建的 table)和共享general tablespaces中存储的 table 形成对比,在共享general tablespaces中,只有InnoDB可以在 table 被截断后使用释放的空间。

截断 table 并将磁盘空间返回给 os 的功能还意味着physical backups可以更小。截断存储在系统 table 空间(在innodb_file_per_table=OFF时创建的 table)或常规 table 空间中的 table,会在 table 空间中留下未使用空间的块。