Tôi giả sử bạn đang sử dụng InnoDB, vì nó là công cụ lưu trữ mặc định trong MySQL 5.5.
Không gian bảng InnoDB phát triển khi bạn chèn dữ liệu, nhưng các tệp không co lại khi bạn xóa dữ liệu. Vì vậy, ví dụ:nếu bạn chèn 1 triệu hàng, và sau đó xóa chúng, tệp sẽ có rất nhiều dung lượng được cấp phát vật lý, nhưng không còn được sử dụng nữa. InnoDB sẽ sử dụng lại không gian đó nếu có thể trước khi phát triển lại tệp không gian bảng.
Ngoài ra, ngay cả khi bạn không xóa, vẫn có thể có một số không gian "lãng phí" vì khi các tệp không gian bảng được tăng kích thước, chúng sẽ được mở rộng bởi một lượng lớn trang, được xác định bởi tùy chọn cấu hình innodb_autoextend_increment
tính bằng megabyte. Cho đến khi các trang đó được lấp đầy bởi dữ liệu, chúng là không gian trống.
Data_free được InnoDB báo cáo là dung lượng bị "lãng phí" trong các trang trống trong tệp vùng bảng trung tâm. Nó không liên quan gì đến giá trị NULL, nó liên quan đến các trang dữ liệu không có hàng trong đó.
Hơn nữa, trong MySQL 5.5, mặc định là tất cả các bảng chia sẻ một vùng bảng trung tâm được gọi là ibdata
. Data_Free cho tất cả các bảng trong không gian bảng này sẽ báo cáo cùng một con số, là lượng không gian trong các trang trống trong toàn bộ không gian bảng, không chỉ cho một bảng.
Bạn cũng có thể phân bổ một vùng bảng riêng cho mỗi bảng (innodb_file_per_table=1
), và đối với các bảng trong không gian bảng riêng biệt, bạn sẽ thấy một giá trị khác nhau trên mỗi bảng cho data_free.
Data_free chỉ báo cáo dung lượng còn lại bởi khoảng trống hoàn toàn trống (một mức độ là một khối trang bằng 1MB). Bạn sẽ nhận thấy rằng data_free luôn là bội số của 1MB. Các khối trang miễn phí nhỏ hơn không được tính trong data_free, cũng không phải là các trang được lấp đầy một phần. Vì vậy, không gian "lãng phí" có thể lớn hơn rất nhiều, nhưng chúng tôi không có cách nào biết được.