Jeg antager, at du bruger InnoDB, fordi det er standardlagringsmotoren i MySQL 5.5.
InnoDB-tablespaces vokser, efterhånden som du indsætter data, men filerne krymper ikke, når du sletter data. Så hvis du for eksempel indsætter 1 million rækker, og derefter sletter dem, vil filen have en masse plads, der er fysisk allokeret, men ikke længere bruges. InnoDB vil genbruge pladsen, hvis den kan, før tablespace-filen vokser igen.
Også selvom du ikke sletter, kan der være noget "spildt" plads, fordi når tablespace-filer øges i størrelse, udvides de med en stor del af sider, bestemt af indstillingsmuligheden innodb_autoextend_increment
i megabyte. Indtil disse sider er fyldt med data, er de ledig plads.
Data_free rapporteret af InnoDB er mængden af "spildt" plads på tomme sider i den centrale tablespace-fil. Det har intet at gøre med NULL-værdier, det har at gøre med datasider, der ikke har rækker i dem.
Yderligere, i MySQL 5.5 er standarden, at alle tabeller deler ét centralt tablespace kaldet ibdata
. Data_Free for alle tabeller i dette tablespace vil rapportere det samme tal, som er mængden af plads på ledige sider i hele tablespacet, ikke kun for én tabel.
Du kan også tildele et separat tablespace pr. tabel (innodb_file_per_table=1
), og for tabeller i separate tablespaces vil du se en anden værdi pr. tabel for data_free.
Data_free rapporterer kun plads efterladt af helt tomme omfang (et omfang er en blok af sider svarende til 1 MB). Du vil bemærke, at data_free altid er et multiplum af 1 MB. Mindre blokke af gratis sider tælles ikke i data_free, og det er heller ikke delvist udfyldte sider. Så den "spildte" plads er nok meget større, men vi har ingen mulighed for at vide det.