我可以安全地终止 InnoDB 表上的 OPTIMIZE TABLE 吗?

KCD*_*KCD 12 mysql innodb database-tuning mysql-5.5

MySQL 的kill 警告文档:

警告

杀死一个表上的REPAIR TABLEorOPTIMIZE TABLE操作会MyISAM导致表损坏且无法使用。对此类表的任何读取或写入都会失败,直到您再次对其进行优化或修复(无中断)。

那是针对 MyISAM 的。

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

Abd*_*naf 10

根据 MySQL 认证指南:

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

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

所以在 InnoDB 的情况下:

Innodb 是 ACID 兼容的,优化表只是将所有记录复制到一个新表中

  1. 如果索引页没有排序,排序它们,
  2. 如果表的统计数据不是最新的(并且无法通过对索引进行排序来完成修复),请更新它们。
  3. 如果表已删除或拆分行,请修复表。

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

此外,在 InnoDB 的情况下,innodb_defragment=1不需要 ROLLBACK,因为在这种情况下OPTIMIZE TABLE是增量的。