“Bảng không hỗ trợ tối ưu hóa, thực hiện tạo lại + phân tích thay thế” nghĩa là gì?


97

Tôi đang làm việc trên MySQL 5.5 và cố gắng xây dựng lại chỉ mục bằng cách sử dụng một OPTIMIZE TABLEtruy vấn. Tôi gặp lỗi bên dưới:

Bảng không hỗ trợ tối ưu hóa, thay vào đó thực hiện tạo lại + phân tích

Điều đó có nghĩa là gì? MySQL engine không cho phép Index Rebuild? Điều gì đang được thực hiện đằng sau thông báo này, ở cấp MySQL 5.5 Engine?

Câu trả lời:


190

Đó thực sự là một thông điệp đầy thông tin.

Có khả năng bạn đang TỐI ƯU HÓA trên bảng InnoDB (bảng sử dụng công cụ lưu trữ InnoDB, thay vì công cụ lưu trữ MyISAM ).

InnoDB không hỗ trợ TỐI ƯU HÓA như cách MyISAM làm. Nó làm điều gì đó khác biệt. Nó tạo một bảng trống và sao chép tất cả các hàng từ bảng hiện có vào đó, và về cơ bản xóa bảng cũ và đổi tên bảng mới, sau đó chạy ANALYZE để thu thập thống kê. Đó là cách gần nhất mà InnoDB có thể thực hiện TỐI ƯU HÓA.

Thông báo bạn nhận được về cơ bản là máy chủ MySQL lặp lại những gì công cụ lưu trữ InnoDB nói với máy chủ MySQL:

Bảng không hỗ trợ tối ưu hóa là công cụ lưu trữ InnoDB nói ...

"Tôi (công cụ lưu trữ InnoDB) không thực hiện thao tác TỐI ƯU HÓA như bạn tôi (công cụ lưu trữ MyISAM) làm."

"thực hiện tạo lại + phân tích thay thế" là công cụ lưu trữ InnoDB nói ...

"Tôi đã quyết định thực hiện một khác nhau tập hợp các hoạt động đó sẽ đạt được một kết quả tương đương."


13
được, bạn có thể vui lòng chia sẻ cách khác mà bạn đang làm.
Vikrant More

Tôi chắc rằng điều này có trong Hướng dẫn tham khảo MySQL ở đâu đó; đây là hành vi được mong đợi và không có gì phải lo lắng. (Ngoại trừ việc bảng sẽ bị "khóa" và không khả dụng trong khi quá trình chạy đến khi hoàn thành, có thể mất một lúc cho bảng HUGH JASS.) Tham khảo: https://dev.mysql.com/doc/refman/5.5/ vi /mize-table.html Xem phần "Chi tiết về InnoDB".
spencer7593

Bạn cũng có thể sử dụng MySQL Workbench để thực hiện tối ưu hóa bảng. Xem tài liệu Trình kiểm tra lược đồ và bảng để biết thêm thông tin. Lưu ý đến tùy chọn "Optimize Table".
Philip Olson

1
Giải thích tuyệt vời cho những người đang bắt đầu trong thế giới db. Cảm ơn bạn rất nhiều
tachomi 13/09/2016

5
Hãy cẩn thận - không sử dụng tính năng này nếu bạn sắp hết dung lượng đĩa vì nó có thể khiến máy chủ của bạn hết khi cố gắng tạo lại bảng rất lớn.
Danny Staple,

22

OPTIMIZE TABLEhoạt động tốt với công cụ InnoDB theo bài viết hỗ trợ chính thức: http://dev.mysql.com/doc/refman/5.5/en/optimize-table.html

Bạn sẽ nhận thấy rằng việc tối ưu hóa bảng InnoDB sẽ xây dựng lại cấu trúc bảng và cập nhật thống kê chỉ mục (đại loại là ALTER TABLE).

Hãy nhớ rằng thông báo này chỉ có thể là đề cập thông tin và thông tin rất quan trọng là trạng thái truy vấn của bạn: chỉ cần OK!

mysql> OPTIMIZE TABLE foo;
+----------+----------+----------+-------------------------------------------------------------------+
| Table    | Op       | Msg_type | Msg_text                                                          |
+----------+----------+----------+-------------------------------------------------------------------+
| test.foo | optimize | note     | Table does not support optimize, doing recreate + analyze instead |
| test.foo | optimize | status   | OK                                                                |
+----------+----------+----------+-------------------------------------------------------------------+

2
Không thực sự, MySQL sẽ đưa ra lý do thất bại: Lỗi ghi tệp tạm thời, Hoạt động không thành công.
iwind

8

Tùy chọn tốt nhất là tạo bảng mới với cùng thuộc tính

CREATE TABLE <NEW.NAME.TABLE> LIKE <TABLE.CRASHED>;
INSERT INTO <NEW.NAME.TABLE> SELECT * FROM <TABLE.CRASHED>;

Đổi tên NEW.NAME.TABLE và TABLE.CRASH

RENAME TABLE <TABLE.CRASHED> TO <TABLE.CRASHED.BACKUP>;
RENAME TABLE <NEW.NAME.TABLE> TO <TABLE.CRASHED>;

Sau khi làm việc tốt, hãy xóa

DROP TABLE <TABLE.CRASHED.BACKUP>;

2
Phương pháp này có giữ các chỉ mục và trình kích hoạt không?
Joel Murphy

1
Phải, tất nhiên. Tất cả bọn họ! Bạn có thể thử sau đó nó sử dụng phpMyAdmin để kiểm tra một lần nữa
tquang

1
Điều này không tạo lại Khoá ngoại.
DanB

1

Tùy chọn tốt hơn là tạo một bảng mới, sao chép các hàng vào bảng đích, thả bảng thực tế và đổi tên bảng mới tạo. Phương pháp này tốt cho các bảng nhỏ,


3
Tôi khuyên bạn nên tập hợp mã ví dụ cùng với câu trả lời của bạn. Hãy xem cách tôi viết một câu trả lời hay
Sáu,
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.