Điều gì có thể khiến TRUNCATE TABLE mất nhiều thời gian?


9

Tôi đang chạy MySQL5.5 với bản sao Master / Slave (1 chủ, 2 nô lệ).

Tôi có một quy trình chạy mỗi tuần một lần và cắt bớt một bảng cụ thể. Bảng không lớn và chỉ có vài nghìn hồ sơ.

Vì một số lý do, TRUNCATE TABLElệnh mất rất nhiều thời gian để thực thi (cả trên chủ và trên nô lệ). Phải mất khoảng 400K ms để thực thi !! Khi nó chạy trên nô lệ, nó làm cho nó bị lag từ Master. Sau khi TRUNCATE TABLEkết thúc, mọi thứ trở lại bình thường.

Tôi biết rằng một trong những nô lệ đã không nhận được bất kỳ lần đọc nào trong khi thực hiện TRUNCATE TABLEvì một nô lệ chuyên dụng và quá trình đọc từ nô lệ đó đã bị hủy bỏ. Ngoài ra, trên nô lệ này, phải mất cùng thời gian để thực hiện.

Đây là cấu trúc bảng: http://pastebin.com/qEQB4juR

Bạn có suy nghĩ gì về cách tôi có thể tăng tốc BẢNG TRUNCATE không?


Có bất kỳ phân vùng trên bàn?
Barbaros Alp

Câu trả lời:


8

Sử dụng TRUNCATE TABLEtrên bảng InnoDB yêu cầu khóa bảng đầy đủ vì TRUNCATE TABLE là DDL (Ngôn ngữ định nghĩa dữ liệu) chứ không phải DML (Thao tác dữ liệu).

Việc làm DELETE FROM user_engagements;này sẽ không giúp ích gì vì thông tin MVCC được ghi vào nhật ký hoàn tác trong ibdata1 và điều đó có thể giúp bảng không bị xóa. Nếu bất kỳ giao dịch không được cam kết nào đang giữ user_engagements, điều đó cũng có khả năng giữ lại TRUNCATE TABLE.

Bạn có thể đổi tên bảng để nó có sẵn ngay lập tức

SET FOREIGN_KEY_CHECKS = 0;
CREATE TABLE user_engagements_new LIKE user_engagements;
ALTER TABLE user_engagements RENAME user_engagements_zap;
ALTER TABLE user_engagements_new RENAME user_engagements;
DROP TABLE user_engagements_zap;
SET FOREIGN_KEY_CHECKS = 1;

Điều này sẽ sao chép nhanh chóng ngoại trừ tuyên bố cuối cùng.

Hãy thử một lần !!!

Nếu bạn có MySQL 5.1.16+, TRUNCATE TABLEyêu cầu đặc quyền DROP . Câu trả lời của tôi thực hiện những gì TRUNCATE TABLEbây giờ làm.

Nếu bạn có MySQL 5.1.15 trở lại, bạn cần có đặc quyền XÓA , mà câu trả lời của tôi bao gồm.


2
Tôi sẽ sử dụng một RENAME TABLEcâu lệnh nhiều phần thay vì ALTER TABLEđể đổi tên nguyên tử: RENAME TABLE user_engagements TO user_engagements_zap, user_engagements_new TO user_engagements; Một điều cần cân nhắc nữa là DROP TABLElàm cho LRU_mutex bị khóa trong khi danh sách LRU được quét và mỗi mục bị xóa - điều này sẽ khiến máy chủ của bạn bị trì hoãn. Percona Server innodb_lazy_drop_tablephải trợ giúp việc này, nhưng DROP TABLEvẫn có thể mất nhiều thời gian trên các hệ thống tập tin ext.
Aaron Brown

có thể truncate tablelà mất nhiều thời gian vì các phân vùng trên bảng (1000), tôi có thể loại bỏ chúng nếu điều đó sẽ dẫn đến giải pháp?
Ran
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.