我可以安全地杀死InnoDB表上的OPTIMIZE TABLE吗?


9

MySQL的kill 警告文档:

警告

杀死表上的REPAIR TABLEOPTIMIZE TABLE操作会MyISAM导致表已损坏且无法使用。除非您再次对其进行优化或修复(不间断),否则对该表的任何读取或写入操作都会失败。

那是给MyISAM的。

杀死OPTIMIZE TABLE针对InnoDB表运行的进程是否还不安全?

Answers:


8

根据MySQL认证指南:

OPTIMIZE TABLE语句通过对MyISAM表进行碎片整理来清理它。这涉及回收因删除和更新而产生的未使用空间,以及合并已拆分和非连续存储的记录。OPTIMIZE TABLE还会对索引页进行排序(如果它们不按顺序排列)并更新索引统计信息

也适用于InnoDB表,但映射到ALTER TABLE,后者将重建表。这将更新索引统计信息并释放聚集索引中的空间。

所以在InnoDB的情况下:

Innodb符合ACID,优化表仅将所有记录复制到新表中

  1. 如果索引页未排序,请对其进行排序,
  2. 如果表的统计信息不是最新的(并且无法通过对索引进行排序来修复),请对其进行更新。
  3. 如果表已删除或拆分行,请修复该表。

而且,如果尝试在运行时杀死它,则不会丢失任何记录。

另外,如果InnoDB使用innodb_defragment=1,则不需要ROLLBACK,因为在这种情况下OPTIMIZE TABLE是增量的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.