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 > 0và xây dựng một câu lệnh SQL OPTIMIZEchỉ 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à OPTIMIZElệnh. Một số người nói rằng OPTIMIZEsẽ 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 OPTIMIZEthực sự gọi ALTER TABLElệnh khi thực hiện đối với các bảng InnoDB. Với ý nghĩ đó, tôi đã chạy ALTER TABLElệ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_freekhô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 NULLvà 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 OPTIMIZElệnh đối với một vài MyISAMbảng có giá trị DATA_FREElớ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_tablenó 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ẻ.