Posso matar com segurança OPTIMIZE TABLE em uma tabela InnoDB?

9

A documentação do MySQL para kill warns :

Atenção

Matar um REPAIR TABLEou OPTIMIZE TABLEoperação em uma MyISAMtabela resultado em uma tabela que é corrompido e inutilizável. Qualquer leitura ou gravação em uma tabela desse tipo falha até que você a otimize ou repare (sem interrupção).

Isso é para o MyISAM.

Também não é seguro matar um OPTIMIZE TABLEprocesso em execução em uma tabela do InnoDB?

KCD
fonte

Respostas:

8

De acordo com o MySQL Certification Guide:

A instrução OPTIMIZE TABLE limpa uma tabela MyISAM desfragmentando-a. Isso envolve recuperar o espaço não utilizado resultante de exclusões e atualizações e registros de coalescência que foram divididos e armazenados de forma não contígua. OPTIMIZE TABLE também classifica as páginas de índice se estiverem com problemas e atualiza as estatísticas do índice

Também funciona para tabelas InnoDB, mas mapeia para ALTER TABLE, que reconstrói a tabela. Isso atualiza as estatísticas do índice e libera espaço no índice clusterizado.

Então, no caso do InnoDB:

Innodb é compatível com ACID, a tabela de otimização simplesmente copia todos os registros em uma nova tabela

  1. Se as páginas de índice não estiverem classificadas, classifique-as,
  2. Se as estatísticas da tabela não estiverem atualizadas (e o reparo não puder ser realizado pela classificação do índice), atualize-as.
  3. Se a tabela tiver excluído ou dividido linhas, repare a tabela.

E se você tentar matá-lo quando estiver em execução, não perderá nenhum registro.

Além disso, no caso do InnoDB com innodb_defragment=1, não haverá necessidade de ROLLBACK, pois nesse caso OPTIMIZE TABLEé incremental.

Abdul Manaf
fonte