Могу ли я безопасно убить OPTIMIZE TABLE для таблицы InnoDB?

9

Документация MySQL для kill предупреждений :

Предупреждение

В результате удаления операции REPAIR TABLEили OPTIMIZE TABLEоперации с MyISAMтаблицей таблица будет повреждена и непригодна для использования. Любые операции чтения или записи в такую ​​таблицу не будут выполнены, пока вы не оптимизируете или не восстановите ее снова (без перерыва).

Это для MyISAM.

Также небезопасно убивать OPTIMIZE TABLEпроцесс, работающий с таблицей InnoDB?

Строймеханизация
источник

Ответы:

8

Согласно Руководству по сертификации MySQL:

Оператор OPTIMIZE TABLE очищает таблицу MyISAM, дефрагментируя ее. Это включает в себя восстановление неиспользуемого пространства, полученного в результате удалений и обновлений, и объединение записей, которые были разделены и сохранены несмежно. OPTIMIZE TABLE также сортирует страницы индекса, если они вышли из строя, и обновляет статистику индекса

Также работает для таблиц InnoDB, но отображается на ALTER TABLE, которая перестраивает таблицу. Это обновляет статистику индекса и освобождает пространство в кластерном индексе.

Так что в случае InnoDB:

Innodb совместим с ACID, таблица оптимизации просто копирует все записи в новую таблицу

  1. Если страницы индекса не отсортированы, сортируйте их,
  2. Если статистика таблицы не обновлена ​​(и восстановление не может быть выполнено путем сортировки индекса), обновите их.
  3. Если в таблице удалены или разбиты строки, восстановите таблицу.

И если вы попытаетесь убить его во время работы, вы не потеряете никаких записей.

Кроме того, в случае InnoDB с innodb_defragment=1, ROLLBACK не требуется, так как в этом случае OPTIMIZE TABLEявляется инкрементным.

Абдул Манаф
источник