从表中删除条目不会减少我的数据库文件

bug*_*s94 5 mysql innodb

我使用了INNODB引擎innodb_table_per_file,所以每个表都有它自己的.ibd文件而不是 ibdata1 文件。

当我在我的用户表中输入 512 条记录时,它的大小从 96 kb 增加到 200 kb 但是当我使用命令删除所有行时

DELETE FROM USERS;
Run Code Online (Sandbox Code Playgroud)

那么我的.ibd文件甚至没有减少一个字节。

但是当我使用命令删除行时

TRUNCATE TABLE USERS
Run Code Online (Sandbox Code Playgroud)

然后我的.ibd文件减少到它的初始大小,即创建时为 96 kb。

现在我想知道.ibd当我使用DELETE FROM USERS WHERE ... 命令时有什么方法可以减少文件

小智 7

案例:

TRUNCATE删除文件并创建另一个文件。顺便说一句,MySQLTRUNCATE中的表不允许使用 FK 依赖项。

DELETE 使记录无效,并且记录所占用的空间可能会在稍后声明以供重用。

另一项操作强制重新排列数据:OPTIMIZE.

关闭情况:

如果您的应用程序以习惯性删除大量数据的方式工作,您应该考虑编写一个 cron 来调用OPTIMIZE受影响的表(有时在低流量期间)。

否则您不必担心这一点,因为正如此处所述“已删除的行保存在链表中,随后的 INSERT 操作会重用旧的行位置”。

考虑是否OPTIMIZE是事务性的 - DDL 语句在 MySQL 中不是事务性的,不确定 OPTIMIZE 是否是 DDL。

如果不是,您可能需要执行其他操作,例如:

  • 从旧表中选择完整内容的结果创建一个新表;
  • 等待数据插入新表;
  • 相互切换表名;
  • 放下旧桌子;

新桌子将有一个干净的石板。