Lembre-se de que OPTIMIZE TABLE não executa desfragmentação. Internamente, o OPTIMIZE TABLE executa várias operações (copiando dados para um arquivo temporário, recriar índices, recalcular estatísticas do índice). De fato, o exemplo que eu tenho pode ser realizado manualmente, como mostrado.
Exemplo: Se você otimizar mydb.mytable
, insira este comando:
OPTIMIZE TABLE mydb.mytable;
Note que o mysql executa algo o seguinte sob o capô:
CREATE TABLE mydb.mytable2 LIKE mydb.mytable;
ALTER TABLE mydb.mytable2 DISABLE KEYS;
INSERT INTO mydb.mytable2 SELECT * FROM mydb.mytable;
ALTER TABLE mydb.mytable2 ENABLE KEYS;
DROP TABLE mydb.mytable;
ALTER TABLE mydb.mytable2 RENAME mydb.mytable;
ANALYZE TABLE mydb.mytable;
Isso é bastante útil para tabelas que apresentam um alto volume de UPDATEs e DELETEs
Realizar isso pode realizar duas coisas
Impeça o mysql de procurar fragmentos em uma tabela na tentativa de carregar dados nos fragmentos do tamanho certo. A eliminação desses fragmentos reduzirá essa operação.
A recomputação das estatísticas do índice ajuda o MySQL Query Optimizer a construir melhores planos EXPLAIN. Caso contrário, as consultas poderão se deteriorar no tempo de execução porque o MySQL Query Optimizer decidiu adivinhar o plano EXPLAIN. Isso seria um sintoma definitivo de uma tabela que teve um alto volume de UPDATEs e DELETEs.
EMBARGO
No que diz respeito ao armazenamento em cache, o armazenamento em cache mergulha rapidamente por causa de uma verificação completa da tabela. Para páginas de índice MyISAM, as páginas entram e saem do MyISAM Key Cache. Para o InnoDB, as páginas de dados e índice entram e saem do InnoDB Buffer Pool.