Tôi có cần reindex bảng mysql sau khi xóa hàng loạt không?


10

Tôi có một bảng trong MySQL với rất nhiều CHERTN và CHỌN mỗi giây. Và có một số lượng lớn một số dữ liệu cũ hơn một lần một ngày. Tôi có cần reindex bảng sau khi xóa? Tôi muốn tăng hiệu suất. Bất cứ ai có thể đề nghị một số lời khuyên? Sử dụng 'innodb' làm công cụ lưu trữ. Tôi có cần thay đổi nó không? Tôi nghĩ rằng nó tốt hơn để chèn và chọn đồng thời. Xin vui lòng cho ý kiến ​​của bạn. Tôi có cần phải làm lại?

Cảm ơn trước..

Câu trả lời:


10

Bạn có cần tối ưu hóa các bảng khi sử dụng InnoDB không? Có và không, tùy thuộc vào khối lượng công việc của bạn và liệu bạn có gặp phải vấn đề về hiệu suất hay không.

Một bản sao dán không biết xấu hổ từ tài liệu MySQL :

Đối với các bảng InnoDB, OPTIMIZE TABLE được ánh xạ thành ALTER TABLE, nó sẽ xây dựng lại bảng để cập nhật số liệu thống kê chỉ mục và không gian không sử dụng miễn phí trong chỉ mục được nhóm. Điều này được hiển thị trong đầu ra của TỐI ƯU HÓA khi bạn chạy nó trên bảng InnoDB, như được hiển thị ở đây:

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                                                                |
+----------+----------+----------+-------------------------------------------------------------------+

Hoạt động này không sử dụng tạo chỉ mục nhanh. Các chỉ mục phụ không được tạo ra một cách hiệu quả vì các khóa được chèn theo thứ tự chúng xuất hiện trong khóa chính. Xem Phần 14,14.6, Giới hạn của xu hướng tạo ra chỉ số nhanh.

InnoDB lưu trữ dữ liệu bằng phương pháp phân bổ trang và không bị phân mảnh theo cách tương tự như các công cụ lưu trữ cũ (như MyISAM). Khi xem xét có nên chạy tối ưu hóa hay không, hãy xem xét khối lượng công việc của các giao dịch mà máy chủ của bạn sẽ xử lý:

  • Một số mức độ phân mảnh được dự kiến. InnoDB chỉ điền vào các trang đầy đủ 93%, để có chỗ cho các bản cập nhật mà không phải chia trang.

  • Xóa các hoạt động có thể để lại các khoảng trống khiến các trang ít được lấp đầy hơn mong muốn, điều này có thể làm cho nó đáng giá để tối ưu hóa bảng.

  • Cập nhật cho các hàng thường viết lại dữ liệu trong cùng một trang, tùy thuộc vào loại dữ liệu và định dạng hàng, khi có đủ không gian. Xem Phần 14.10.5, Cách thức hoạt động của nén đối với Bảng InnoDB và Phần 14.12.1, Tổng quan về Lưu trữ hàng của InnoDB.

  • Khối lượng công việc đồng thời cao có thể để lại các khoảng trống trong các chỉ mục theo thời gian, vì InnoDB giữ lại nhiều phiên bản của cùng một dữ liệu thông qua cơ chế MVCC của nó. Xem Phần 14,5.12, trực tiếp nhiều phiên bản của InnoDB.


5

Bạn có thể reindex bảng và thậm chí thu nhỏ bảng. Tuy nhiên, nếu bạn muốn trì hoãn việc bảo trì dựa trên đĩa như vậy, ít nhất, bạn nên tính lại số liệu thống kê chỉ mục.

Nếu không tính toán lại các thống kê chỉ mục, Trình tối ưu hóa truy vấn MySQL có thể đưa ra các lựa chọn không tốt cho các kế hoạch GIẢI THÍCH truy vấn. Điều này có thể ảnh hưởng xấu đến CHỌN nếu số liệu thống kê cho dữ liệu không tồn tại vẫn còn. Điều này đúng cho cả MyISAM và InnoDB.

Bạn không phải thu nhỏ bảng để tính toán thống kê chỉ số, mặc dù nó sẽ tốt hơn cho hiệu suất tổng thể.

Để tính toán thống kê cho tất cả các chỉ mục trong một bảng, bạn sẽ chạy

ANALYZE TABLE tablename;

Bạn có thể làm điều này mỗi đêm. Nó sẽ không cố gắng thực hiện bất kỳ phân mảnh hoặc thu nhỏ dữ liệu. Bạn có thể có thể làm điều đó một lần một tuần bằng cách chạy OPTIMIZE TABLE tablename;. Điều này cũng sẽ làm ANALYZE TABLE tablename;cho bạn sau khi thu nhỏ tệp vật lý của bảng ( .ibdcho InnoDB hoặc .MYIcho MyISAM) hoặc.


3

TỐI ƯU BẢNG hầu như không bao giờ cần thiết trên InnoDB.

Bạn đang XÓA hồ sơ dựa trên tuổi? Nếu vậy, bạn có thể thực hiện "xóa hàng loạt" về cơ bản miễn phí bằng cách sử dụng PHẦN THAM GIA và DROP PHẦN. Thêm chi tiết tại đây: http://mysql.rjweb.org/doc.php/partitionmaint

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.