Abdul Manaf Asked: 2012-01-18 03:37:21 +0800 CST2012-01-18 03:37:21 +0800 CST 2012-01-18 03:37:21 +0800 CST InnoDB“每个表”文件大小的问题 772 我已经用innodb per table. 有一个watchdog大约 19GBwatchdog.ibd文件的表。 我已经截断了表,现在它的记录为零。但watchdog.ibd大小相同。 有什么问题。?truncate不适用于从 .ibd 文件中删除数据.. ? 我不想放弃这张桌子,因为我需要这张桌子。 mysql innodb 2 个回答 Voted Best Answer RolandoMySQLDBA 2012-01-18T08:55:33+08:002012-01-18T08:55:33+08:00 请记住,这TRUNCATE TABLE是一个 DDL 命令,它告诉 InnoDB 存储引擎假装没有记录。 根据关于TRUNCATE TABLE的 MySQL 文档: 当使用快速截断时,它会将任何 AUTO_INCREMENT 计数器重置为零。从 MySQL 5.0.13 开始,AUTO_INCREMENT 计数器被 TRUNCATE TABLE 重置为零,无论是否存在外键约束。) 但是,TRUNCATE TABLE对已分配的空间没有任何作用。 要快速将空间降为零行,您可以执行以下操作: # # Algorithm 1 # CREATE TABLE watchdog_new LIKE watchdog; ALTER TABLE watchdog RENAME watchdog_zap; ALTER TABLE watchdog_new RENAME watchdog; DROP TABLE watchdog_zap; 由于TRUNCATE TABLE告诉 mysql 表被认为是空的,你可以这样做: # # Algorithm 2 # TRUNCATE TABLE watchdog; ALTER TABLE watchdog ENGINE=InnoDB; 这两个步骤的行为方式与Algorithm 1. 这些步骤也可以用 # # Algorithm 3 # TRUNCATE TABLE watchdog; OPTIMIZE TABLE watchdog; 在内部,OPTIMIZE TABLE将执行Algorithm 1然后执行ANALYZE TABLE。对于 InnoDB,ANALYZE TABLE阶段OPTIMIZE TABLE被绕过。事实上,这是不必要的,因为索引统计信息是在针对 InnoDB 表执行的每个查询上重新计算的。 gbn 2012-01-18T06:00:14+08:002012-01-18T06:00:14+08:00 通常不会从 InnoDB 文件中删除空间 要回收空间,您必须OPTIMIZE TABLE来创建临时表/文件并切换它们。或者以其他方式使用临时表/ DROP+ CREATE/CREATE TABLE..LIKE等通过另一个操作强制执行此过程
请记住,这
TRUNCATE TABLE
是一个 DDL 命令,它告诉 InnoDB 存储引擎假装没有记录。根据关于TRUNCATE TABLE的 MySQL 文档:
但是,
TRUNCATE TABLE
对已分配的空间没有任何作用。要快速将空间降为零行,您可以执行以下操作:
由于
TRUNCATE TABLE
告诉 mysql 表被认为是空的,你可以这样做:这两个步骤的行为方式与
Algorithm 1
.这些步骤也可以用
在内部,OPTIMIZE TABLE将执行
Algorithm 1
然后执行ANALYZE TABLE。对于 InnoDB,ANALYZE TABLE
阶段OPTIMIZE TABLE
被绕过。事实上,这是不必要的,因为索引统计信息是在针对 InnoDB 表执行的每个查询上重新计算的。通常不会从 InnoDB 文件中删除空间
要回收空间,您必须OPTIMIZE TABLE来创建临时表/文件并切换它们。或者以其他方式使用临时表/
DROP
+CREATE
/CREATE TABLE..LIKE
等通过另一个操作强制执行此过程