Sửa InnoDB không nhỏ bằng một lần bấm nút. MyISAM là.
Dưới mui xe, OPTIMIZE TABLE sẽ làm điều này với một bảng MyISAM gọi mytb:
- Tạo bảng temp trống với cùng một cấu trúc như mytb
dữ liệu
- Sao chép MyISAM từ mytb vào bảng tạm
- Drop bảng mytb
- Đổi tên bảng tạm thời thành mytb
- Chạy ANALYZE TABLE chống lại mytb và thống kê chỉ mục cửa hàng
ưu hóa TABLE không hoạt động theo cách đó với InnoDB vì hai lý do chính:
LÝ DO # 1: InnoDB Lưu trữ Layout
Theo mặc định, InnoDB có innodb_file_per_table người tàn tật. Tất cả mọi thứ InnoDB và vùng đất bà của nó trong ibdata1. Chạy TỐI ƯU HÓA TABLE nào sau đây để một bảng InnoDB gọi mytb:
- Tạo bảng InnoDB tạm rỗng với cùng một cấu trúc như mytb
- Sao chép InnoDB dữ liệu từ mytb vào bảng tạm
- Drop bảng mytb
- Đổi tên bảng temp để mytb
- Run PHÂN TÍCH bẢNG chống mytb và chỉ số cửa hàng thống kê
Thật không may, bảng tạm thời được sử dụng để thu hẹp mytb được nối vào ibdata1. Tăng trưởng nhanh cho ibdata1 !!! Trong điều kiện này, ibdata1 sẽ không bao giờ co lại. Đối với vấn đề tồi tệ hơn, BẢNG ANALYZE là vô ích (Giải thích trong REASON # 2)
Nếu bạn đã bật innodb_file_per_table, bốn (4) bước đầu tiên sẽ hoạt động vì dữ liệu không được lưu trữ trong ibdata1, nhưng trong một tệp vùng bảng bên ngoài mytb.ibd. Điều đó có thể co lại.
REASON # 2: Thống kê chỉ mục luôn được tính toán lại
InnoDB không lưu trữ số liệu thống kê chỉ mục một cách hiệu quả. Trong thực tế, nếu bạn chạy BẢNG ANALYZE trên mytb, các số liệu thống kê được tạo và lưu trữ. Thật không may, theo thiết kế, InnoDB sẽ đi sâu vào các trang BTREE của các chỉ mục của nó, phỏng đoán các đặc tính quan trọng và sử dụng những con số đó để chuẩn bị cho Trình tối ưu hóa truy vấn MySQL. Đây là một dự án đang tiến hành. Trong thực tế, ANALYZE TABLE là vô ích bởi vì các số liệu thống kê chỉ mục được tính toán được ghi đè với mỗi truy vấn được thực hiện đối với bảng đó.I wrote about this in the DBA StackExchange June 21, 2011.
Percona explained this thoroughly in www.mysqlperformanceblog.com
Đối với chi phí trong MyISAM, con số đó có thể được tìm ra.
Đối với bảng MyISAM, chi phí đại diện cho phân mảnh nội bộ. Điều này khá phổ biến trong một bảng có các trải nghiệm, INSERT, UPDATE và DELETE, đặc biệt nếu bạn có các cột BLOB hoặc VARCHAR. Chạy OPTIMIZE TABLE làm cho phân mảnh như vậy biến mất bằng cách sao chép vào bảng tạm thời (tự nhiên không sao chép không gian trống).
Quay lại InnoDB, cách bạn loại bỏ hiệu quả không gian lãng phí? Bạn cần phải rearchitect ibdata1 để giữ ít thông tin hơn. Withing ibdata1 bạn có bốn loại dữ liệu:
- Bảng dữ liệu trang
- dữ liệu trang Index
- Bảng MetaData
- MVCC dữ liệu cho giao dịch
Bạn permamnently có thể di chuyển Bảng và Chỉ số Out của ibdata1 mãi mãi. Điều gì về dữ liệu và chỉ mục đã được đặt trong ibdata1?
Thực hiện theo Kế hoạch Cleanup InnoDB mà tôi được đăng ngày 29 tháng 10 năm 2010: Howto: Clean a mysql InnoDB storage engine?
tôi đã không cập nhật hoặc chèn hoặc xóa bất cứ điều gì, tôi chỉ cần thay đổi myisam để innodb, sau đó giá trị của overhead đã lên đến 3.072.0KiB và giá trị hiệu quả đi xuống -3,129,344. Nó có bình thường không? Hoặc thực sự tôi cần phải thiết lập một cái gì đó trước khi thay đổi myisam để innodb để ngăn chặn vấn đề trên không/hiệu quả? – zac1987
@ zac1987 trả lời này có vẻ hơi muộn, nhưng bạn có thể thử OPTIMIZE TABLE trước khi bạn thay đổi nó thành InnoDB. – Raptor