Fiz muita pesquisa sobre como manter índices no MySQL para impedir a fragmentação e otimizar de alguma forma a execução de algumas consultas.
Eu estou familiarizado com essa fórmula que calcula a proporção entre o espaço máximo disponível para uma tabela e o espaço usado por dados e índices.
No entanto, minhas principais perguntas ainda não foram respondidas. Talvez isso se deva ao fato de eu estar familiarizado com a manutenção de índices no SQL Server e ter a tendência de pensar que no MySQL deve ser algo semelhante.
No SQL Server, você pode ter vários índices e cada um deles pode ter diferentes níveis de fragmentação. Em seguida, você pode escolher um e executar uma operação 'REORGANIZE' ou 'REBUILD' nesse índice específico, sem afetar o restante.
Que eu saiba, não existe uma 'fragmentação de tabela' e o SQL Server não fornece nenhuma ferramenta para corrigir a 'fragmentação de tabela'. O que ele fornece são ferramentas para verificar a fragmentação do índice (entendida como a proporção entre o número de páginas usadas por um índice e a plenitude dessa página e contiguidade), bem como a fragmentação interna e externa.
Tudo isso é bastante simples de entender, pelo menos para mim.
Agora, quando chega a hora de manter índices no MySQL, existe apenas o conceito de 'fragmentação de tabela', como mencionado acima.
Uma tabela no MySQL pode ter vários índices, mas quando eu checo a 'taxa de fragmentação' com essa famosa fórmula, não vejo a fragmentação de cada índice, mas a tabela como um todo.
Quando quero otimizar os índices no MySQL, não escolho um índice específico para operar (como no SQL Server). Em vez disso, eu faço uma operação 'OPTIMIZE' em toda a tabela, o que presumivelmente afeta todos os índices.
Quando a tabela é otimizada no MySQL, a proporção entre o espaço usado pelos dados + índices e o espaço geral é reduzida, o que sugere algum tipo de reorganização física no disco rígido, o que se traduz em uma redução do espaço físico. No entanto, a fragmentação do índice não se refere apenas ao espaço físico, mas à estrutura da árvore que foi alterada ao longo do tempo devido a inserções e atualizações.
Finalmente, consegui uma tabela no InnoDB / MySQL. Essa tabela possui 3 milhões de registros, 105 colunas e 55 índices. São 1,5 GB, excluindo índices, que são 2,1 GB.
Essa tabela está sendo atingida milhares de vezes por dia para atualização e inserção (na verdade, não excluímos registros).
Essa tabela foi criada há anos e eu tenho certeza de que ninguém mantém nenhum índice.
Eu esperava encontrar uma enorme fragmentação lá, mas quando eu executo o cálculo de fragmentação conforme prescrito
free_space / (data_length + index_length)
Acontece que eu tenho apenas uma fragmentação de 0,2%. IMHO que é bastante irreal.
Portanto, as grandes questões são:
- Como verifico a fragmentação de um índice específico no MySQL, não a tabela como um todo
- O OPTIMIZE TABLE realmente corrige a fragmentação interna / externa de um índice como no SQL Server?
- Quando otimizo uma tabela no MySQL, ele realmente recria todos os índices da tabela?
- É realista pensar que reduzir o espaço físico de um índice (sem reconstruir a própria árvore) realmente se traduz em um melhor desempenho?