MySQL 8.3 Release Notes
要在截断 InnoDB 表时回收操作系统磁盘空间,表必须存储在其自己的 .ibd 文件中。要将表存储在其自己的 .ibd 文件中,innodb_file_per_table 必须在创建表时启用。此外,截断表和其他表之间不能有 外键 约束,否则 TRUNCATE TABLE 操作将失败。但是,在同一表中的两个列之间的外键约束是允许的。
当表被截断时,它将被删除并在新的 .ibd 文件中重新创建,并将释放的空间返回给操作系统。这与截断存储在 InnoDB 系统表空间 中的 InnoDB 表(在 innodb_file_per_table=OFF 时创建的表)和存储在共享 通用表空间 中的表不同,在这些情况下,只有 InnoDB 可以在表被截断后使用释放的空间。
能够截断表并将磁盘空间返回给操作系统也意味着 物理备份 可以变得更小。截断存储在系统表空间(在 innodb_file_per_table=OFF 时创建的表)或在通用表空间中的表将在表空间中留下未使用的块。