Câu trả lời ngắn gọn:
select ENGINE, TABLE_NAME,Round( DATA_LENGTH/1024/1024) as data_length , round(INDEX_LENGTH/1024/1024) as index_length, round(DATA_FREE/ 1024/1024) as data_free from information_schema.tables where DATA_FREE > 0;
Câu trả lời "Bạn phải biết"
trước hết bạn phải hiểu rằng các bảng Mysql bị phân mảnh khi một hàng được cập nhật, vì vậy đó là một tình huống bình thường. Khi một bảng được tạo, giả sử được nhập bằng cách sử dụng kết xuất dữ liệu, tất cả các hàng được lưu trữ không có phân mảnh trong nhiều trang có kích thước cố định. Khi bạn cập nhật một hàng có chiều dài thay đổi, trang chứa hàng này được chia thành hai hoặc nhiều trang để lưu trữ các thay đổi và hai trang mới (hoặc nhiều hơn) này chứa các khoảng trống lấp đầy khoảng trống không sử dụng.
Điều này không ảnh hưởng đến hiệu suất, trừ khi tất nhiên sự phân mảnh tăng quá nhiều. Quá nhiều phân mảnh, hãy xem truy vấn bạn đang tìm kiếm:
select ENGINE, TABLE_NAME,Round( DATA_LENGTH/1024/1024) as data_length , round(INDEX_LENGTH/1024/1024) as index_length, round(DATA_FREE/ 1024/1024) as data_free from information_schema.tables where DATA_FREE > 0;
DATA_LENGTH và INDEX_LENGTH là không gian mà dữ liệu và chỉ mục của bạn đang sử dụng và DATA_FREE là tổng số byte không được sử dụng trong tất cả các trang của bảng (phân mảnh).
Đây là một ví dụ về một bảng sản xuất thực sự
| ENGINE | TABLE_NAME | data_length | index_length | data_free |
| InnoDB | comments | 896 | 316 | 5 |
Trong trường hợp này, chúng tôi có Bảng sử dụng (896 + 316) = 1212 MB và có dữ liệu không gian trống là 5 MB. Điều này có nghĩa là "tỷ lệ phân mảnh" của:
5/1212 = 0.0041
... Đó là một "tỷ lệ phân mảnh" thực sự thấp.
Tôi đã làm việc với các bảng có tỷ lệ gần 0,2 (nghĩa là 20% khoảng trống) và không bao giờ nhận thấy sự chậm lại của các truy vấn, ngay cả khi tôi tối ưu hóa bảng, hiệu suất vẫn như nhau. Nhưng áp dụng bảng tối ưu hóa trên bảng 800 MB sẽ mất rất nhiều thời gian và chặn bảng trong vài phút, điều này không thể thực hiện được trong quá trình sản xuất.
Vì vậy, nếu bạn xem xét những gì bạn giành được trong hiệu suất và thời gian lãng phí trong việc tối ưu hóa một bảng, tôi không thích tối ưu hóa.
Nếu bạn nghĩ rằng tốt hơn cho việc lưu trữ, hãy xem tỷ lệ của bạn và xem bạn có thể tiết kiệm được bao nhiêu dung lượng khi tối ưu hóa. Nó thường không quá nhiều, vì vậy tôi không thích tối ưu hóa.
Và nếu bạn tối ưu hóa, bản cập nhật tiếp theo sẽ tạo khoảng trắng bằng cách chia một trang thành hai hoặc nhiều hơn. Nhưng cập nhật bảng phân mảnh nhanh hơn bảng không phân mảnh, vì nếu bảng bị phân mảnh, bản cập nhật trên một hàng không nhất thiết sẽ chia một trang.
Tôi hy vọng cái này sẽ giúp bạn.