Supongo que está utilizando InnoDB, porque es el motor de almacenamiento predeterminado en MySQL 5.5.
Los espacios de tabla de InnoDB crecen a medida que inserta datos, pero los archivos no se reducen cuando elimina datos. Entonces, por ejemplo, si inserta 1 millón de filas y luego las elimina, el archivo tendrá mucho espacio asignado físicamente, pero que ya no se usa. InnoDB reutilizará ese espacio si puede antes de volver a hacer crecer el archivo de espacio de tablas.
Además, incluso si no elimina, puede haber algo de espacio "desperdiciado" porque cuando los archivos de tablespace aumentan de tamaño, se expanden en una gran parte de las páginas, determinado por la opción de configuración innodb_autoextend_increment
en megabytes. Hasta que esas páginas se llenen de datos, son espacio libre.
Data_free informado por InnoDB es la cantidad de espacio "desperdiciado" en páginas vacías en el archivo de tablespace central. No tiene nada que ver con valores NULL, tiene que ver con páginas de datos que no tienen filas.
Además, en MySQL 5.5, el valor predeterminado es que todas las tablas compartan un espacio de tabla central llamado ibdata
. El data_Free para todas las tablas en este espacio de tablas reportará la misma cifra, que es la cantidad de espacio en páginas libres en todo el espacio de tablas, no solo para una tabla.
También puede asignar un tablespace separado por tabla (innodb_file_per_table=1
), y para tablas en espacios de tablas separados, verá un valor diferente por tabla para data_free.
Data_free solo informa el espacio dejado por extensiones totalmente vacías (una extensión es un bloque de páginas igual a 1 MB). Notará que data_free siempre es un múltiplo de 1 MB. Los bloques más pequeños de páginas gratuitas no se cuentan en data_free, ni tampoco las páginas parcialmente llenas. Entonces, el espacio "desperdiciado" probablemente sea mucho mayor, pero no tenemos forma de saberlo.