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 > 0e cria uma instrução SQL OPTIMIZEapenas 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 OPTIMIZEcomando. Alguns dizem que OPTIMIZEnão funcionará com tabelas do InnoDB e que você precisa executar ALTER TABLE table_name ENGINE=INNODB. Outros dizem que, OPTIMIZEna verdade, chama o ALTER TABLEcomando ao executar nas tabelas do InnoDB. Com isso em mente, executei o ALTER TABLEcomando em uma das tabelas do InnoDB identificadas como fragmentadas ( data_free > 0) e descobri que data_freeelas 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 NULLe nenhuma foi retornada. Eles são todos maiores que zero.
Também executei o OPTIMIZEcomando em algumas MyISAMtabelas onde DATA_FREEera 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.