Tôi đã nghiên cứu cách tối ưu hóa chỉ các bảng phân mảnh trong MySQL và xem xét bài đăng này trên các bảng tối ưu hóa . Về cơ bản, nó thực hiện một truy vấn đối với cơ sở dữ liệu information_schema cho bất kỳ bảng nào data_free > 0
và xây dựng một câu lệnh SQL OPTIMIZE
chỉ cho các bảng đó. Tôi đã chạy truy vấn này và nó đã xác định 148 bảng để tối ưu hóa. Tất cả các bảng được xác định là các bảng InnoDB. Sau khi thực hiện tập lệnh SQL tối ưu hóa kết quả, tôi chạy lại tập lệnh gốc để xác định các bảng bị phân mảnh và nó trả về chính xác các bảng trong lần truyền đầu tiên.
Tôi đã thấy các bài viết mâu thuẫn về các bảng InnoDB và OPTIMIZE
lệnh. Một số người nói rằng OPTIMIZE
sẽ không hoạt động với các bảng InnoDB và bạn cần phải chạy ALTER TABLE table_name ENGINE=INNODB
. Những người khác nói rằng OPTIMIZE
thực sự gọi ALTER TABLE
lệnh khi thực hiện đối với các bảng InnoDB. Với ý nghĩ đó, tôi đã chạy ALTER TABLE
lệnh chống lại một trong các bảng InnoDB được xác định là bị phân mảnh ( data_free > 0
) và thấy rằng điều đó data_free
không thay đổi sau đó. Nó vẫn lớn hơn 0. Tôi cũng khởi động lại MySQL và chỉ kiểm tra nó để tìm kết quả tương tự.
Bây giờ, chúng tôi có một số máy chủ chạy MySQL 5.5,29 trong tổ chức của chúng tôi và tôi đã chạy một truy vấn đối với tất cả chúng để xác định bất kỳ bảng InnoDB nào DATA_FREE=0 or NULL
và không có bảng nào được trả về. Tất cả đều lớn hơn không.
Tôi cũng đã chạy OPTIMIZE
lệnh đối với một vài MyISAM
bảng có giá trị DATA_FREE
lớn hơn 0 và xác minh rằng nó bằng 0 sau đó.
Ai đó có thể làm sáng tỏ vấn đề này giúp tôi không? Phương pháp thích hợp để loại bỏ phân mảnh khỏi các bảng InnoDB là gì? Phương pháp thích hợp để xác định các bảng InnoDB bị phân mảnh là gì?
Cảm ơn
innodb_file_per_table
nó cũng sẽ hiển thị cùng một giá trị cho mỗi bảng trong không gian bảng được chia sẻ.