Предполагам, че използвате InnoDB, защото това е машината за съхранение по подразбиране в MySQL 5.5.
Пространствата за таблици InnoDB нарастват, когато вмъквате данни, но файловете не се свиват, когато изтриете данни. Така например, ако вмъкнете 1 милион реда и след това ги изтриете, файлът ще има много място, което е физически разпределено, но вече не се използва. InnoDB ще използва повторно това пространство, ако може, преди да увеличи отново файла на пространството за таблици.
Освен това, дори и да не изтриете, може да има малко "загубено" пространство, защото когато файловете на пространството за таблици се увеличат по размер, те се разширяват с голяма част от страници, определени от опцията за конфигурация innodb_autoextend_increment
в мегабайти. Докато тези страници не се запълнят с данни, те са свободно място.
Data_free, отчетен от InnoDB, е количеството пространство, "загубено" в празни страници в централния файл на пространството за таблици. Това няма нищо общо с NULL стойности, има общо със страници с данни, които нямат редове в тях.
Освен това в MySQL 5.5 по подразбиране всички таблици споделят едно централно пространство за таблици, наречено ibdata
. Data_Free за всички таблици в това пространство за таблици ще отчита една и съща цифра, която е количеството пространство в свободните страници в цялото пространство за таблици, а не само за една таблица.
Можете също така да разпределите отделно пространство за таблица на таблица (innodb_file_per_table=1
), а за таблици в отделни пространства за таблици ще видите различна стойност за таблица за data_free.
Data_free отчита само място, оставено от напълно празни екстенти (екстент е блок от страници, равен на 1MB). Ще забележите, че data_free винаги е кратно на 1MB. По-малките блокове безплатни страници не се броят в data_free, нито частично попълнените страници. Така че „загубеното“ пространство вероятно е много по-голямо, но няма как да го разберем.