从表中删除行后恢复磁盘空间

pra*_*tri 7 mysql innodb mysql-5.5

我使用 innodb 引擎从其中一个表中删除了数百万行。我知道我需要运行optimize table才能恢复空间。但是运行它会导致表锁定,这将影响生产查询。有没有其他方法可以在不影响生产查询的情况下恢复空间。

innodb_file_per_table 是 ON 并且表中有大约 15,221,827 行。

没有约束或外键。

Rol*_*DBA 7

您必须使表脱机,以防止任何会被锁定并可能不得不回滚的读取或写入。如果该表被调用mydb.mytable,则您必须执行以下操作:

USE mydb
DROP TABLE IF EXISTS mytablenew;
CREATE TABLE mytablenew LIKE mytable;
ALTER TABLE mytable RENAME mytableold;
INSERT INTO mytablenew SELECT * FROM mytableold;
ANALYZE TABLE mytablenew;
ALTER TABLE mytablenew RENAME mytable;
DROP TABLE mytableold;
Run Code Online (Sandbox Code Playgroud)

任何尝试读取或写入的查询mytable都将立即失败,而不是挂在来自 的锁上OPTIMIZE TABLE

试一试 !!!

更新 2013-08-26 15:24 EDT

回顾一下我建议的代码。请注意线

ALTER TABLE mytable RENAME mytableold;
Run Code Online (Sandbox Code Playgroud)

该行使表相对于应用程序脱机。

要了解优化需要多长时间,请运行以下命令:

USE mydb
CREATE TABLE mytablenew LIKE mytable;
INSERT INTO mytablenew SELECT * FROM mytable;
Run Code Online (Sandbox Code Playgroud)

无论这需要多长时间,实际运行需要多长时间。