Suponho que você esteja usando o InnoDB, porque é o mecanismo de armazenamento padrão no MySQL 5.5.
Os espaços de tabela do InnoDB aumentam à medida que você insere dados, mas os arquivos não diminuem quando você exclui dados. Por exemplo, se você inserir 1 milhão de linhas e depois excluí-las, o arquivo terá muito espaço alocado fisicamente, mas não será mais usado. O InnoDB reutilizará esse espaço se puder antes de aumentar o arquivo de tablespace novamente.
Além disso, mesmo se você não excluir, pode haver algum espaço "desperdiçado" porque quando os arquivos de tablespace aumentam de tamanho, eles são expandidos por um grande pedaço de páginas, determinado pela opção de configuração
innodb_autoextend_increment
em megabytes. Até que essas páginas sejam preenchidas por dados, elas são espaço livre. Data_free relatado pelo InnoDB é a quantidade de espaço "desperdiçado" em páginas vazias no arquivo de tablespace central. Não tem nada a ver com valores NULL, tem a ver com páginas de dados que não possuem linhas nelas.
Além disso, no MySQL 5.5, o padrão é que todas as tabelas compartilhem um tablespace central chamado
ibdata
. O data_Free para todas as tabelas neste tablespace reportará a mesma figura, que é a quantidade de espaço em páginas livres em todo o tablespace, não apenas para uma tabela. Você também pode alocar um espaço de tabela separado por tabela (
innodb_file_per_table=1
), e para tabelas em tablespaces separados, você verá um valor diferente por tabela para data_free. Data_free informa apenas o espaço deixado por extensões totalmente vazias (uma extensão é um bloco de páginas igual a 1 MB). Você notará que data_free é sempre um múltiplo de 1 MB. Blocos menores de páginas gratuitas não são contados em data_free, nem páginas parcialmente preenchidas. Portanto, o espaço "desperdiçado" é provavelmente muito maior, mas não temos como saber.