我使用了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。
如果不是,您可能需要执行其他操作,例如:
新桌子将有一个干净的石板。