Saya berasumsi Anda menggunakan InnoDB, karena ini adalah mesin penyimpanan default di MySQL 5.5.
Ruang tabel InnoDB bertambah saat Anda memasukkan data, tetapi file tidak menyusut saat Anda menghapus data. Jadi misalnya jika Anda memasukkan 1 juta baris, dan kemudian menghapusnya, file tersebut akan memiliki banyak ruang yang dialokasikan secara fisik, tetapi tidak lagi digunakan. InnoDB akan menggunakan kembali ruang itu jika bisa sebelum mengembangkan file tablespace lagi.
Juga, bahkan jika Anda tidak menghapus, mungkin ada beberapa ruang "terbuang" karena ketika file tablespace bertambah ukurannya, mereka diperluas oleh sebagian besar halaman, ditentukan oleh opsi konfigurasi innodb_autoextend_increment
dalam megabyte. Sampai halaman tersebut diisi oleh data, mereka adalah ruang kosong.
Data_free yang dilaporkan oleh InnoDB adalah jumlah ruang yang "terbuang" di halaman kosong di file tablespace pusat. Ini tidak ada hubungannya dengan nilai NULL, ini ada hubungannya dengan halaman data yang tidak memiliki baris di dalamnya.
Selanjutnya, di MySQL 5.5, defaultnya adalah semua tabel berbagi satu tablespace pusat yang disebut ibdata
. Data_Free untuk semua tabel di tablespace ini akan melaporkan angka yang sama, yaitu jumlah ruang di halaman kosong di seluruh tablespace, tidak hanya untuk satu tabel.
Anda juga dapat mengalokasikan tablespace terpisah per tabel (innodb_file_per_table=1
), dan untuk tabel di tablespace terpisah, Anda akan melihat nilai yang berbeda per tabel untuk data_free.
Data_free hanya melaporkan ruang yang tersisa dari ekstensi yang benar-benar kosong (tingkat adalah blok halaman yang sama dengan 1MB). Anda akan melihat bahwa data_free selalu kelipatan 1MB. Blok halaman gratis yang lebih kecil tidak dihitung dalam data_free, juga halaman yang terisi sebagian. Jadi ruang yang "terbuang" mungkin jauh lebih besar, tetapi kita tidak tahu cara untuk mengetahuinya.