Je suppose que vous utilisez InnoDB, car c'est le moteur de stockage par défaut de MySQL 5.5.
Les espaces de table InnoDB grandissent à mesure que vous insérez des données, mais les fichiers ne rétrécissent pas lorsque vous supprimez des données. Ainsi, par exemple, si vous insérez 1 million de lignes, puis que vous les supprimez, le fichier aura beaucoup d'espace qui est physiquement alloué, mais qui n'est plus utilisé. InnoDB réutilisera cet espace s'il le peut avant de développer à nouveau le fichier d'espace de table.
De plus, même si vous ne supprimez pas, il peut y avoir de l'espace "gaspillé" car lorsque la taille des fichiers d'espace de table augmente, ils sont étendus d'un gros morceau de pages, déterminé par l'option de configuration innodb_autoextend_increment
en mégaoctets. Tant que ces pages ne sont pas remplies de données, elles constituent un espace libre.
Data_free signalé par InnoDB est la quantité d'espace "gaspillée" dans les pages vides du fichier d'espace de table central. Cela n'a rien à voir avec les valeurs NULL, cela a à voir avec les pages de données qui ne contiennent pas de lignes.
De plus, dans MySQL 5.5, la valeur par défaut est que toutes les tables partagent un espace de table central appelé ibdata
. Le data_Free pour toutes les tables de ce tablespace rapportera le même chiffre, qui est la quantité d'espace dans les pages libres dans tout le tablespace, pas seulement pour une table.
Vous pouvez également allouer un tablespace séparé par table (innodb_file_per_table=1
), et pour les tables dans des tablespaces séparés, vous verrez une valeur différente par table pour data_free.
Data_free ne signale que l'espace laissé par des extents totalement vides (une extension est un bloc de pages égal à 1Mo). Vous remarquerez que data_free est toujours un multiple de 1 Mo. Les petits blocs de pages libres ne sont pas comptés dans data_free, pas plus que les pages partiellement remplies. L'espace "gaspillé" est donc probablement beaucoup plus important, mais nous n'avons aucun moyen de le savoir.