Xóa một lượng lớn (4 triệu hàng) dữ liệu mysql một cách hiệu quả, trên cơ sở rất thường xuyên


10

Chúng tôi có một bảng mysql tại bất kỳ thời điểm nào cũng có khoảng 12 triệu hàng. Chúng ta cần xóa dữ liệu cũ để giữ cho kích thước của bảng có thể quản lý được.

Ngay bây giờ chúng tôi đang chạy truy vấn này hàng ngày, vào lúc nửa đêm, bằng cách sử dụng một công việc định kỳ:

DELETE FROM table WHERE endTime < '1393632001'

Lần cuối cùng truy vấn chạy, nó đã kiểm tra 4.602.400, mất hơn 3 phút và CPU đi qua mái nhà.

CPU tăng vọt vào nửa đêm

Chúng ta có thể làm gì để giữ cho CPU, các kết nối db đồng bộ, độ sâu của đĩa, v.v. không bị tăng vọt một cách vô lý trong khi vẫn xóa dữ liệu cũ?

PS: Bạn sẽ nhận thấy rằng truy vấn đang thực sự xảy ra vào thời điểm không phù hợp trong chu kỳ sử dụng của chúng tôi. Giả sử rằng chúng tôi đã thay đổi thời gian của truy vấn xảy ra ở điểm sử dụng thấp nhất mỗi ngày. Ngoài ra, không có chỉ mục nào về "endTime" và tôi muốn giữ nguyên như vậy nếu có thể vì có rất nhiều dữ liệu được chèn rất thường xuyên và không cần tra cứu nhiều.

php  mysql 

có thể Sử dụng các công việc định kỳ để xóa cứ sau 10 phút và 100k mỗi vòng hoặc cứ sau 5 phút 50k mỗi vòng

khối nhỏ hơn trên cơ sở thường xuyên hơn?

ok, nhưng có vẻ như điều đó có thể làm tê liệt trải nghiệm người dùng của chúng tôi trong thời gian dài hơn :) bất cứ điều gì chúng ta có thể thực hiện truy vấn / thiết kế khôn ngoan?

1
Người dùng 186k, không có anh chàng db chuyên dụng?

1
Bạn sẽ nhận được câu trả lời tốt hơn về "Quản trị viên cơ sở dữ liệu"
James Anderson

Câu trả lời:


13

Giải pháp cho vấn đề của bạn là một khả năng của MySQL được gọi là "phân vùng". Các tài liệu ở đây .

Những gì phân vùng làm là lưu trữ một bảng trong "phân vùng" riêng biệt. Chúng được xác định bởi một biểu thức cụ thể, thường là giá trị cột hoặc phạm vi. Trong trường hợp của bạn, điều này có thể sẽ dựa trên endTime- giả sử rằng nó được biết khi bản ghi được tạo và nó không thay đổi.

Bạn sẽ lưu trữ giá trị của một ngày endTimetrong mỗi phân vùng. Sau đó, bước xóa sẽ là cắt bớt một phân vùng thay vì xóa một loạt các hàng trong một bảng lớn. Việc cắt bớt phân vùng sẽ là một phương pháp nhanh hơn nhiều.


wow, điều đó cực kỳ hữu ích, và có vẻ như là một giải pháp hoàn hảo. Thời gian để đọc lên phân vùng! Cảm ơn!

Mặc dù phân vùng có thể là một giải pháp tốt, hãy cẩn thận với chi phí - nó có thể làm chậm đáng kể các truy vấn của bạn. Ngoài ra, bảng cắt ngắn cũng không phải là ngay lập tức. Tôi sẽ xem xét pt-archiver. Bạn có thể giải quyết vấn đề của mình bằng các mũi nhọn và giữ cho bảng của bạn đơn giản như bây giờ
akuzminsky
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.