a resposta curta:
select ENGINE, TABLE_NAME,Round( DATA_LENGTH/1024/1024) as data_length , round(INDEX_LENGTH/1024/1024) as index_length, round(DATA_FREE/ 1024/1024) as data_free from information_schema.tables where DATA_FREE > 0;
A resposta "Você deve saber"
primeiro, você deve entender que as tabelas do Mysql ficam fragmentadas quando uma linha é atualizada, então é uma situação normal. Quando uma tabela é criada, digamos, importada usando um dump com dados, todas as linhas são armazenadas sem fragmentação em muitas páginas de tamanho fixo. Quando você atualiza uma linha de tamanho variável, a página que contém essa linha é dividida em duas ou mais páginas para armazenar as alterações, e essas novas duas (ou mais) páginas contêm espaços em branco preenchendo o espaço não utilizado.
Isso não afeta o desempenho, a menos que a fragmentação cresça demais. O que é muita fragmentação, bem, vamos ver a consulta que você está procurando:
select ENGINE, TABLE_NAME,Round( DATA_LENGTH/1024/1024) as data_length , round(INDEX_LENGTH/1024/1024) as index_length, round(DATA_FREE/ 1024/1024) as data_free from information_schema.tables where DATA_FREE > 0;
O DATA_LENGTH e o INDEX_LENGTH são o espaço que seus dados e índices estão usando e DATA_FREE é a quantidade total de bytes não utilizados em todas as páginas da tabela (fragmentação).
Aqui está um exemplo de uma tabela de produção real
| ENGINE | TABLE_NAME | data_length | index_length | data_free |
| InnoDB | comments | 896 | 316 | 5 |
Neste caso, temos uma tabela usando (896 + 316) = 1212 MB e os dados têm um espaço livre de 5 MB. Isso significa uma "proporção de fragmentação" de:
5/1212 = 0.0041
... Qual é realmente uma "taxa de fragmentação" baixa.
Eu tenho trabalhado com tabelas com uma proporção próxima de 0,2 (significando 20% de espaços em branco) e nunca noto uma diminuição nas consultas, mesmo se eu otimizar a tabela, o desempenho é o mesmo. Mas aplicar uma tabela de otimização em uma mesa de 800MB leva muito tempo e bloqueia a tabela por vários minutos, o que é impraticável na produção.
Então, se você considerar o que ganha no desempenho e o tempo perdido para otimizar uma tabela, prefiro NÃO OTIMIZAR.
Se você acha que é melhor para o armazenamento, veja sua proporção e veja quanto espaço você pode economizar quando otimizar. Geralmente não é muito, então eu prefiro não otimizar.
E, se você otimizar, a próxima atualização criará espaços em branco dividindo uma página em dois ou mais. Mas é mais rápido atualizar uma tabela fragmentada do que uma não fragmentada, porque se a tabela estiver fragmentada, uma atualização em uma linha não necessariamente dividirá uma página.
Espero que isso ajude você.