Iam 使用INNODB
引擎innodb_table_per_file
,因此每个表都有自己的.ibd
文件而不是 ibdata1 文件。
当我在我的用户表中输入 512 记录时,它的大小从 96 kb 增加到 200 kb 但是当我使用命令删除所有行时
DELETE FROM USERS;
那么我的.ibd
文件甚至没有减少一个字节。
但是当我使用命令删除行时
TRUNCATE TABLE USERS
然后我的.ibd
文件减小到它的初始大小,即创建时 96 kb。
现在我想知道当我使用 命令时有什么方法可以减少.ibd
文件DELETE FROM USERS WHERE ...
案例:
TRUNCATE
删除文件并创建另一个文件。TRUNCATE
在具有 FK 依赖项的表上不允许使用MySQL 中的 BTW 。DELETE 使记录无效,并且记录用于占用的空间可以在以后声明以供重用。
另一项操作强制重新排列数据:
OPTIMIZE
.关闭案例:
如果您的应用程序以习惯性删除大量数据的方式工作,您应该考虑编写一个 cron 来调用
OPTIMIZE
受影响的表(有时在低流量期间)。否则,您不必担心这一点,因为如此处所述“删除的行在链表中维护,后续的 INSERT 操作重用旧行位置”。
考虑是否
OPTIMIZE
是事务性的 - DDL 语句在 MySQL 中不是事务性的,不确定 OPTIMIZE 是否是 DDL。如果不是,您可能需要执行其他操作,例如:
新表将有一个干净的石板。
如果您想批量压缩所有 InnoDB 表,请运行以下命令: