Xóa hàng loạt cho Bảng lớn trong MySQL


9

Tôi có bảng Thông báo chứa khoảng 100 triệu máy chủ lưu trữ trong Amazon RDS với 1000 IOPS và tôi muốn xóa các hàng đó cũ hơn một tháng.

Nếu tôi làm như vậy DELETE FROM NOTIFICATION WHERE CreatedAt < DATE_SUB(CURDATE(), INTERVAL 30 day);, tất cả các IOPS sẽ được thực hiện, quá trình sẽ mất hàng giờ và rất nhiều mục mới không thể được chèn do "Đã hết thời gian chờ khóa; thử khởi động lại giao dịch".

Tôi đã cố gắng thực hiện theo cách mô tả ở đây: http://mysql.rjweb.org/doc.php/deletebig Tuy nhiên, tôi đang sử dụng UUID thay vì ID tăng.

Cách chính xác và hiệu quả để xóa các hàng đó trong khi không ảnh hưởng đến dữ liệu mới được chèn / cập nhật là gì?


Bạn đúng ypercube, tôi đã khắc phục nó. Cảm ơn đã chỉ ra!
Tianyi Cong

Xóa các bản ghi trong các phần nhỏ hơn, không ảnh hưởng đến hoạt động chèn, tôi đã thử nó với vòng lặp và nó hoàn thành việc xóa 70 triệu bản ghi trong vòng chưa đầy một giờ rathishkumar.in/2017/12/ trộm
Rathish

Câu trả lời:


10

Tạo một bảng tạm thời, chuyển đổi vào và ra và sao chép dữ liệu 30 ngày qua vào đó.

#
# Make empty temp table
#
CREATE TABLE NOTIFICATION_NEW LIKE NOTIFICATION;
#
# Switch in new empty temp table
#
RENAME TABLE NOTIFICATION TO NOTIFICATION_OLD,NOTIFICATION_NEW TO NOTIFICATION;
#
# Retrieve last 30 days data 
#
INSERT INTO NOTIFICATION SELECT * FROM NOTIFICATION_OLD
WHERE CreatedAt >= DATE_SUB(CURDATE(), INTERVAL 30 DAY);

Trong giờ nghỉ của bạn, bỏ cái bàn cũ

DROP TABLE NOTIFICATION_OLD;

Dưới đây là những thuận lợi để thực hiện XÓA như thế này

  1. NOTIFICATION được làm trống nhanh bằng cách chuyển đổi trong một bảng trống.
  2. NOTIFICATION ngay lập tức có sẵn cho các INSERT mới
  3. 30 ngày còn lại được thêm lại NOTIFICATIONtrong khi INSERT mới có thể diễn ra.
  4. Bỏ phiên bản cũ NOTIFICATIONkhông can thiệp vào INSERT mới
  5. LƯU Ý: Tôi đã khuyên bạn nên thực hiện chuyển đổi mồi cho bảng XÓA trước: (Xem bài đăng ngày 19 tháng 7 năm 2012 của tôi: Tối ưu hóa Truy vấn XÓA trên Bảng NHỚ MySQL )

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


Cảm ơn Rolando trả lời! Làm thế nào để MySql nội bộ xử lý bảng thả? Đầu tiên xóa tất cả các cột sau đó xóa bảng hoặc cái gì khác? Nó sẽ mất thời gian ngắn hơn nhiều so với xóa những cloumns?
Tianyi Cong

Tôi đang áp dụng chiến lược này để dàn dựng, liệu đổi tên lệnh có nên bắt đầu bằng "RENAME TABLE" không?
Tianyi Cong

3

Yêu thích của tôi là pt-archiver từ Percona Toolkit. Nó đảm nhiệm tải MySQL, độ trễ nhân rộng.


Cảm ơn trả lời akuzminsky! Tôi sẽ nhìn vào nó. Tôi đã từng thử Percona khi tôi muốn thay đổi bảng thông báo này bằng pt-online-lược đồ-thay đổi. Tuy nhiên, nó đòi hỏi đặc quyền SUPER để thực hiện thay đổi, không được cung cấp bởi RDS. BTW bạn có biết cách nào tốt để thay đổi bảng lớn không?
Tianyi Cong

@TianyiCong bạn có một câu hỏi mới: vui lòng hỏi nó như một câu hỏi mới và có thể bình luận ở đây với một liên kết, đừng hỏi nó trong các bình luận không phải là cách trang web này hoạt động.
Jack nói hãy thử topanswers.xyz

-2

tạo bảng notify_temp khi chọn * từ thông báo trong đó createdAt <DATE_SUB (CURDATE (), INTERVAL 30 ngày);

thông báo thả bảng;

RENAME notify_temp ĐẾN THÔNG BÁO;


Và điều này sẽ không ảnh hưởng đến dữ liệu mới được chèn / cập nhật? Tôi không nghĩ vậy.
Colin 't Hart

Phương pháp này có 2 vấn đề 1) làm cho THÔNG BÁO không có sẵn trong thời gian BẢNG DROP. 2) CHỨNG MINH xảy ra trong quá trình CREATE TABLEbị bỏ lỡ.
RolandoMySQLDBA

Một vấn đề khác: cần phải nóiRENAME TABLE notification_temp ...
RolandoMySQLDBA
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.