O comando MySQL Optimize table irá efetivamente desfragmentar a sua tabela e deve ser usado por tabelas que são frequentemente atualizadas e/ou deletadas registros.
Ex.: Nós temos uma tabela chamada articles que tem muitos registros de linhas que são frequentemente inseridos, atualizados e deletados. Nós podes ver na descrição da tabela abaixo contém tipos de dados de colunas de comprimento variável:
mysql> desc articles; +----------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +----------------+--------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | content | text | NO | | NULL | | | author_id | int(11) | YES | | NULL | | | article_title | varchar(120) | YES | | NULL | | | article_hash | int(11) | YES | | NULL | | +----------------+--------------+------+-----+---------+----------------+ 6 rows in set (0.00 sec)
Se nós formos olhar o tamanho da tabela no disco, iremos ver que está por volta de 190MB. Se nós efetuarmos uma query na tabela em uma coluna que é indexada nós teremos uma média de tempo do resultado da query: e.g.
mysql> select count(*) from articles where article_title like 'The%'; +----------+ | count(*) | +----------+ | 15830 | +----------+ 1 row in set (0.63 sec)
Se nós agora optimizarmos a tabela com o seguinte comando:
mysql> optimize table articles; +-----------------------+----------+----------+----------+ | Table | Op | Msg_type | Msg_text | +-----------------------+----------+----------+----------+ | books.articles | optimize | status | OK | +-----------------------+----------+----------+----------+ 1 row in set (6.27 sec)
Isso irá desfragmentar a tabela reduzindo o tamanho da tabela para 105MB. E também tem mais um ponto positivo que afeta diretamente na performance, reduzindo o tempo de resposta da query de 0.63s para 0.39s. Obs. O mysql query cache foi deixado como off para a demonstração.
mysql> select count(*) from articles where article_title like 'The%'; +----------+ | count(*) | +----------+ | 15830 | +----------+ 1 row in set (0.39 sec)
Para maiores informações sobre o comando OPTIMIZE TABLE:
Fonte: dbtuna

Autor: Rafael Stoever
Bacharel em Sistema de Informação pela Uniasselvi, atualmente cursando Gerenciamento de Projetos em TI pela Pós Graduação Uniasselvi. Atuo como Analista de suporte a banco de dados – DBA pela Lumina Serviços em TI residente de Blumenau/ SC, OPN Certified Specialist, Certificado OCP 10g/11g/12c, OCE RAC10g e Linux 10g. Conhecimentos em Microsoft SqlSever, Mysql e programação web (php,asp).
O post é antigo, mas isso ainda funciona.
Otimo artigo, vlw
Este captcha diminui bots porem também diminui os comentários de usuários reais
Vi que para haver diminuição do espaço em disco precisa ativar o parâmetro innodb_file_per_table=1. Como eu sei se este parâmetro já está ativado?
Eu acho que ele está, porque dentro de /var/lib/mysql/zabbix há vários arquivos .ibd.
mysql Ver 15.1 Distrib 10.0.38-MariaDB, for Linux (x86_64) using readline 5.1
Talvez essa versão já venha com o parâmetro ativado.
Outra dúvida: eu posso executar o optimize com o sistema em operação?
Perdoe-nos a demora para a sua pergunta, provavelmente essa duvida já tenha sido sanada, mas serva para os proximos:
show global variables like ‘innodb_file_per_%’;
Para mostrar como esta a variavel.
Pode executar o optimize a qualquer horário, porem isso pode gerar alguma contenção durante o horário do optimize, nossa recomendação é rodar em horário de menor utilização do ambiente.