Zakładam, że używasz InnoDB, ponieważ jest to domyślny silnik przechowywania w MySQL 5.5.
Przestrzenie tabel InnoDB powiększają się w miarę wstawiania danych, ale pliki nie zmniejszają się podczas usuwania danych. Na przykład, jeśli wstawisz 1 milion wierszy, a następnie je usuniesz, plik będzie miał dużo miejsca, które jest fizycznie przydzielone, ale nie będzie już używane. InnoDB użyje ponownie tej przestrzeni, jeśli będzie to możliwe, przed ponownym powiększeniem pliku przestrzeni tabel.
Ponadto, nawet jeśli nie usuniesz, może pojawić się trochę "zmarnowanego" miejsca, ponieważ gdy rozmiar plików obszaru tabel jest powiększany, są one powiększane o duży fragment stron, określony przez opcję konfiguracji innodb_autoextend_increment
w megabajtach. Dopóki te strony nie zostaną wypełnione danymi, pozostają wolne miejsce.
Data_free zgłaszana przez InnoDB to ilość miejsca „zmarnowanego” na pustych stronach w centralnym pliku obszaru tabel. Nie ma to nic wspólnego z wartościami NULL, ma to związek ze stronami danych, które nie zawierają wierszy.
Ponadto w MySQL 5.5 domyślnie wszystkie tabele współdzielą jeden centralny obszar tabel o nazwie ibdata
. Data_Free dla wszystkich tabel w tym obszarze tabel poda tę samą wartość, czyli ilość miejsca na wolnych stronach w całym obszarze tabel, a nie tylko dla jednej tabeli.
Możesz także przydzielić oddzielny obszar tabel na tabelę (innodb_file_per_table=1
), a dla tabel w oddzielnych przestrzeniach tabel zobaczysz inną wartość dla każdej tabeli dla data_free.
Data_free zgłasza tylko miejsce pozostawione przez całkowicie puste zakresy (zakres to blok stron równy 1MB). Zauważysz, że data_free to zawsze wielokrotność 1 MB. Mniejsze bloki bezpłatnych stron nie są liczone w data_free, ani częściowo wypełnione strony. Tak więc „zmarnowana” przestrzeń jest prawdopodobnie znacznie większa, ale nie mamy możliwości jej poznania.