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
- Se as páginas de índice não estiverem classificadas, classifique-as,
- 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.
- 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.