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"
Em primeiro lugar, você deve entender que as tabelas Mysql são fragmentadas quando uma linha é atualizada, portanto é 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 comprimento variável, a página que contém esta 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;
DATA_LENGTH e 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 |
Nesse caso, temos uma tabela usando (896 + 316) = 1212 MB e temos dados em um espaço livre de 5 MB. Isso significa uma "taxa de fragmentação" de:
5/1212 = 0.0041
... Qual é uma "taxa de fragmentação" realmente baixa.
Eu tenho trabalhado com tabelas com uma proporção próxima de 0,2 (ou seja, 20% dos espaços em branco) e nunca percebi uma lentidão nas consultas, mesmo se eu otimizar a tabela, o desempenho será o mesmo. Mas aplicar uma tabela de otimização em uma tabela de 800 MB leva muito tempo e bloqueia a tabela por vários minutos, o que é impraticável na produção.
Portanto, se você considerar o que ganha em desempenho e o tempo perdido em otimizar uma tabela, prefiro NÃO OTIMIZAR.
Se você acha que é melhor para armazenamento, veja sua proporção e quanto espaço você pode economizar ao 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 duas 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ê.