Eu tenho pesquisado como otimizar apenas tabelas fragmentadas no MySQL e revi este post sobre otimização de tabelas . Basicamente, ele executa uma consulta no banco de dados information_schema para qualquer tabela data_free > 0
e cria uma instrução SQL OPTIMIZE
apenas para essas tabelas. Fiz essa consulta e ele identificou 148 tabelas para otimização. Todas as tabelas identificadas são tabelas do InnoDB. Após executar o script SQL de otimização resultante, executei novamente o script original para identificar tabelas fragmentadas e ele retornou exatamente as mesmas tabelas durante a primeira passagem.
Vi posts conflitantes sobre as tabelas do InnoDB e o OPTIMIZE
comando. Alguns dizem que OPTIMIZE
não funcionará com tabelas do InnoDB e que você precisa executar ALTER TABLE table_name ENGINE=INNODB
. Outros dizem que, OPTIMIZE
na verdade, chama o ALTER TABLE
comando ao executar nas tabelas do InnoDB. Com isso em mente, executei o ALTER TABLE
comando em uma das tabelas do InnoDB identificadas como fragmentadas ( data_free > 0
) e descobri que data_free
elas não foram alteradas posteriormente. Ainda é maior que 0. Também reiniciei o MySQL e verifiquei apenas para encontrar os mesmos resultados.
Agora, temos vários servidores executando o MySQL 5.5.29 em nossa organização e executei uma consulta em todos eles para identificar quaisquer tabelas do InnoDB DATA_FREE=0 or NULL
e nenhuma foi retornada. Eles são todos maiores que zero.
Também executei o OPTIMIZE
comando em algumas MyISAM
tabelas onde DATA_FREE
era maior que zero e verifiquei que era zero depois.
Alguém pode lançar alguma luz sobre isso para mim? Qual é o método adequado para remover a fragmentação das tabelas do InnoDB? Qual é o método adequado para determinar tabelas InnoDB fragmentadas?
obrigado
innodb_file_per_table
, também mostrará o mesmo valor para todas as tabelas no espaço de tabela compartilhado.