Cách tiếp cận tốt nhất để chạy truy vấn XÓA trên 92K của 4 triệu hàng là gì?


7

Các tùy chọn đã xảy ra với tôi:

  1. Một tuyên bố xóa lớn. Ví dụ:

    delete from x where (y = 'x' and x = 'y') or (y = 'a' and x = 'b')
  2. Tương tự như trên, nhưng chunk trong miếng nhỏ hơn, 10k một lần?

  3. Tạo một thủ tục được lưu trữ để tất cả những gì tôi gửi là hai giá trị truy vấn.

Câu trả lời:


8

92K trong số 4M vẫn chỉ là 2,3% trong hồ sơ của bạn. Tôi muốn đề xuất tùy chọn đầu tiên của bạn, chỉ cần ném những gì bạn muốn xóa vào cơ sở dữ liệu và để cơ sở dữ liệu sắp xếp nó (nếu bạn đưa nó vào cơ sở dữ liệu cùng một lúc, rất có thể nó sẽ làm việc đó hiệu quả hơn so với việc bạn gửi nó ngoài). Lần duy nhất tôi khuyên bạn nên kiểm tra nó là nếu ứng dụng của bạn rất quan trọng về thời gian và bạn lo lắng về việc làm chậm nó (trong trường hợp đó, giải pháp khác là thực hiện ngoài giờ).

Nếu bạn lấy 20-30% hoặc nhiều hơn các bản ghi ra khỏi bảng, tôi khuyên bạn nên bỏ các chỉ mục, thực hiện xóa và tạo lại các chỉ mục, theo sau là một OPTIMIZE TABLE, nhưng đối với 2% các bản ghi trong bảng thì chỉ mục sẽ được xây dựng lại chi phí không đáng là bao (chỉ nhanh hơn để giữ cho các chỉ mục được cập nhật trong khi xóa các bản ghi).

Điều đó nói rằng, sau khi bạn thực hiện xóa, chạy OPTIMIZE TABLEcó thể không phải là một ý tưởng tồi - mặc dù vậy, đừng làm điều đó trong giờ cao điểm.


4

Tôi sẽ luôn luôn sử dụng DELETE QUICKthay vì chỉ DELETE, vì nó ít hoạt động hơn với các chỉ mục trong quá trình xóa, và sau đó ở giai đoạn sau khi bạn có cơ hội tối ưu hóa bảng, các chỉ mục bị bỏ lại phía sau được tập hợp lại.

Tôi chắc chắn khuyên bạn nên đọc tài liệu trên DELETE QUICKđể xem nếu nó sẽ giúp.

http://dev.mysql.com/doc/refman/5.5/en/delete.html


1
Tôi thích DELETE QUICKMyISAM (được chỉ định trong liên kết của bạn) vì nó thực hiện những gì TÙY CHỌN 2 trong câu trả lời của tôi. +1 !!!
RolandoMySQLDBA

2

Bạn muốn chắc chắn rằng kế hoạch của bạn đang Tìm kiếm để tìm các hồ sơ quan tâm. Vì vậy, làm cho nó chạy độc đáo như là một CHỌN đầu tiên với các chỉ mục thích hợp.

Nếu khóa liên quan đến việc thực hiện XÓA là một nỗi đau, thì hãy thực hiện theo đợt. Nhưng nếu truy vấn của bạn đang quét bảng, thì việc sử dụng các đợt sẽ kết thúc việc quét bảng nhiều lần.

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.