Câu trả lời:
Để mở rộng câu trả lời của @ MitchWheat (+1 để trả lời trực tiếp trước):
ANALYZE TABLE kiểm tra phân phối khóa và lưu trữ chúng trong Information_SCHema.STATISTICS .
BẢNG TỐI ƯU thực hiện BẢNG PHÂN TÍCH sau khi thực hiện nén bảng. Tương đươngOPTIMIZE TABLE mydb.mytable;
nếu bảng là MyISAM là:
ALTER TABLE mydb.mytable ENGINE=MyISAM;
ANALYZE TABLE mydb.mytable;
Đối với bảng MyISAM mydb.mytable trong datadir /var/lib/mysql
, bạn có các tệp sau:
/var/lib/mysql/mydb/mytable.frm
/var/lib/mysql/mydb/mytable.MYD
(dữ liệu)/var/lib/mysql/mydb/mytable.MYI
(chỉ mục)OPTIMIZE TABLE mydb.mytable
sẽ thu nhỏ .MYD
và .MYI
các tập tin cho bảng.
Điều này không giống với InnoDB. Đây là cách nó khác nhau:
Dữ liệu và chỉ mục của mỗi bảng được lưu trữ trong một tệp không gian bảng bên ngoài. Cho datadir
là /var/lib/mysql
và bảng mydb.mytable
, nó sẽ được lưu trữ như sau:
/var/lib/mysql/mydb/mytable.frm
/var/lib/mysql/mydb/mytable.ibd
Khi OPTIMIZE TABLE mydb.mytable
được thực thi, mytable.ibd
được thu nhỏ.
Chỉ /var/lib/mysql/mydb/mytable.frm
tồn tại. Tất cả các trang dữ liệu và chỉ mục cho bảng mydb.mytable
được lưu trữ trong tệp không gian bảng hệ thống /var/lib/mysql/ibdata1
.
Khi OPTIMIZE TABLE mydb.mytable
được thực thi, các trang dữ liệu và chỉ mục được viết liền kề trong ibdata1. Thật không may, điều này làm cho ibdata1 phát triển nhảy vọt.
Xem Đại diện hình ảnh từ Percona CTO Vadim Tkachenko
Bạn bình luận là
Tôi nghĩ rằng, tối ưu hóa bảng cho innodb không được hỗ trợ. Tôi nhận được một tin nhắn, chỉ mục sẽ được tạo lại. Làm thế nào nó hoạt động?
Tôi đã thử nó
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.5.29 MySQL Community Server (GPL)
Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> use test
Database changed
mysql> create table dat (a int, primary key (a));
Query OK, 0 rows affected (0.08 sec)
mysql> insert into dat values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10);
Query OK, 10 rows affected (0.04 sec)
Records: 10 Duplicates: 0 Warnings: 0
mysql> analyze table dat;
+----------+---------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+----------+---------+----------+----------+
| test.dat | analyze | status | OK |
+----------+---------+----------+----------+
1 row in set (0.06 sec)
mysql> optimize table dat;
+----------+----------+----------+-------------------------------------------------------------------+
| Table | Op | Msg_type | Msg_text |
+----------+----------+----------+-------------------------------------------------------------------+
| test.dat | optimize | note | Table does not support optimize, doing recreate + analyze instead |
| test.dat | optimize | status | OK |
+----------+----------+----------+-------------------------------------------------------------------+
2 rows in set (0.14 sec)
mysql>
Bạn nói đúng. Bạn không thể chạy OPTIMIZE TABLE
như một hoạt động đơn lẻ. Những gì InnoDB làm thay vào đó là như sau:
ALTER TABLE mydb.mytable ENGINE=InnoDB;
ANALYZE TABLE mydb.mytable;
Bạn cũng có thể tự chạy các bước này.
Tuy nhiên, trong tất cả sự trung thực, bạn không cần phải chạy theo ANALYZE TABLE
bảng InnoDB vì mỗi lần thực hiện truy vấn, Công cụ lưu trữ InnoDB sẽ thực hiện ước tính về số lượng thẻ dựa trên việc đi qua các trang trong các chỉ mục. Nếu có một số lượng lớn INSERTs
, UPDATEs
và DELETEs
, sau đó bạn sẽ cần phải ANALYZE TABLE
. Khi có số lượng lớn DELETEs
, thì ALTER TABLE mydb.mytable ENGINE=InnoDB;
cần phải thu nhỏ bảng.
Tôi thực sự đã viết bài viết về sự vô ích của ANALYZE TABLE
InnoDB trong một số trường hợp nhất định:
OPTIMIZE TABLE
." Khi bạn OPTIMIZE TABLE
cho một bảng InnoDB, MySQL đang thực hiện ALTER TABLE ... ENGINE=InnoDB
và ANALYZE TABLE ...
thao tác cho bạn khi nó nói "thực hiện tái tạo + phân tích bảng thay thế."
OPTIMIZE TABLE dat;
trong MySQL 5.5,29 và nó đã phàn nàn ngay lập tức Table does not support optimize, doing recreate + analyze instead
. Đó là lý do tại sao tôi khuyên bạn nên ALTER TABLE dat ENGINE=InnoDB; ANALYZE TABLE dat;
.
OPTIMIZE TABLE
sử dụng InnoDB, máy chủ thực sự thực hiện ALTER TABLE ... ENGINE=InnoDB
và thực hiện ANALYZE TABLE
phía sau hậu trường trước khi trả lại phản hồi đó ... vì vậy bạn thực sự có thể chạy OPTIMIZE TABLE
trên InnoDB và đạt được hiệu quả như mong muốn.
Phụ thuộc vào phiên bản MySQL và công cụ lưu trữ của bạn, nhưng nói chung:
BẢNG TỐI ƯU Bảng phân tích, lưu trữ phân phối khóa cho một bảng, lấy lại không gian chưa sử dụng và phân mảnh tệp dữ liệu.
BẢNG PHÂN TÍCH Chỉ phân tích bảng và lưu trữ phân phối khóa.