Ich nehme an, Sie verwenden InnoDB, weil es die Standard-Speicher-Engine in MySQL 5.5 ist.
InnoDB-Tablespaces wachsen, wenn Sie Daten einfügen, aber die Dateien schrumpfen nicht, wenn Sie Daten löschen. Wenn Sie also beispielsweise 1 Million Zeilen einfügen und sie dann löschen, hat die Datei viel Speicherplatz, der physisch zugewiesen, aber nicht mehr verwendet wird. InnoDB wird diesen Speicherplatz nach Möglichkeit wiederverwenden, bevor die Tablespace-Datei erneut vergrößert wird.
Auch wenn Sie nicht löschen, kann etwas "verschwendeter" Speicherplatz entstehen, denn wenn Tablespace-Dateien vergrößert werden, werden sie um einen großen Teil von Seiten erweitert, der durch die Konfigurationsoption innodb_autoextend_increment
bestimmt wird in Megabyte. Bis diese Seiten mit Daten gefüllt sind, sind sie freier Speicherplatz.
Data_free, das von InnoDB gemeldet wird, ist die Menge an Speicherplatz, die in leeren Seiten in der zentralen Tablespace-Datei „verschwendet“ wird. Es hat nichts mit NULL-Werten zu tun, es hat mit Datenseiten zu tun, die keine Zeilen enthalten.
Außerdem teilen sich in MySQL 5.5 standardmäßig alle Tabellen einen zentralen Tablespace namens ibdata
. Der data_Free für alle Tabellen in diesem Tablespace gibt dieselbe Zahl aus, nämlich die Menge an Speicherplatz in freien Seiten im gesamten Tablespace, nicht nur für eine Tabelle.
Sie können auch pro Tabelle einen separaten Tablespace zuweisen (innodb_file_per_table=1
) und für Tabellen in separaten Tablespaces sehen Sie einen anderen Wert pro Tabelle für data_free.
Data_free meldet nur Speicherplatz, der von völlig leeren Extents übrig bleibt (Ein Extent ist ein Block von Seiten gleich 1 MB). Sie werden feststellen, dass data_free immer ein Vielfaches von 1 MB ist. Kleinere Blöcke freier Seiten werden nicht in data_free gezählt, ebenso wenig gefüllte Seiten. Der "verschwendete" Speicherplatz ist also wahrscheinlich viel größer, aber wir können es nicht wissen.