2013-05-15 41 views
5

Tôi có một truy vấn như thế này mất nhiều thời gian để chạy. Bảng này có khoảng 4 triệu hàng.MySQL chậm khi xóa các bản ghi trong bảng lớn

DELETE FROM TABLE WHERE value_was IS NULL OR value_was <= value_now; 

Tôi hy vọng tôi có thể tạo ra một chỉ số cho (value_was, value_now) vì vậy tôi có thể làm điều gì đó như

DELETE FROM TABLE WHERE 
ID1 IN (SELECT ID1 from TABLE where value_was IS NULL) 
OR ID2 IN (SELECT ID2 FROM TABLE WHERE value_was <= value_now); 

bảng này không có khóa chính. Nó có hai phím tổng hợp. Và tôi đoán tôi không thể sử dụng cùng một bảng trong truy vấn con, nhưng làm cách nào để cải thiện hiệu suất của truy vấn đầu tiên?

Cảm ơn rất nhiều đề xuất sẽ được đánh giá cao.

Cập nhật: Các db là InnoDB

+0

Bảng có được lưu trữ trong công cụ lưu trữ 'myISAM' hoặc' innoDB' không? –

+0

Đó là innoDB. Tôi cũng đã cập nhật câu hỏi. – toy

Trả lời

7

Do cách dữ liệu được lưu trữ, như là một danh sách liên kết nội bộ, bảng InnoDB vốn đã chậm tại DELETE hoạt động rất lớn. Việc thay đổi kiểu lưu trữ thành myISAM sẽ làm cho hoạt động nhanh hơn rất nhiều - Tôi đã thấy 100x cải thiện trong các tình huống tương tự.

+0

Cảm ơn câu trả lời. nhưng vì đó là một hệ thống di sản tôi không thể thay đổi động cơ. Có anyway tôi có thể cải thiện các truy vấn trong innoDB? – toy

+0

Ở đây http://bytes.com/topic/mysql/answers/77660-speed-innodb-deletes-large-tables một anh chàng gợi ý tăng key_buffer_size –

+1

Bài viết này http://mysql.rjweb.org/doc.php/deletebig cung cấp nhiều thông tin chi tiết hơn, nhưng tôi không thể biết nó bao nhiêu tuổi ... HTH, anyway :) –

Các vấn đề liên quan