Xóa dữ liệu khỏi InnoDB là thao tác tốn kém nhất mà bạn có thể yêu cầu. Như bạn đã phát hiện ra, bản thân truy vấn không phải là vấn đề - dù sao thì hầu hết chúng đều sẽ được tối ưu hóa cho cùng một kế hoạch thực thi.
Mặc dù có thể khó hiểu tại sao DELETE trong tất cả các trường hợp là chậm nhất, nhưng có một lời giải thích khá đơn giản. InnoDB là một công cụ lưu trữ giao dịch. Điều đó có nghĩa là nếu truy vấn của bạn bị hủy bỏ giữa chừng, tất cả các bản ghi sẽ vẫn ở nguyên như thể không có gì xảy ra. Sau khi hoàn tất, tất cả sẽ biến mất ngay lập tức. Trong quá trình DELETE các ứng dụng khách khác kết nối với máy chủ sẽ thấy các bản ghi cho đến khi quá trình DELETE của bạn hoàn tất.
Để đạt được điều này, InnoDB sử dụng một kỹ thuật gọi là MVCC (Multi Version Concurrency Control). Về cơ bản, những gì nó làm là cung cấp cho mỗi kết nối một chế độ xem ảnh chụp nhanh của toàn bộ cơ sở dữ liệu như khi câu lệnh đầu tiên của giao dịch bắt đầu. Để đạt được điều này, mọi bản ghi trong InnoDB nội bộ có thể có nhiều giá trị - một giá trị cho mỗi ảnh chụp nhanh. Đây cũng là lý do tại sao COUNTing trên InnoDB mất một khoảng thời gian - nó phụ thuộc vào trạng thái ảnh chụp nhanh mà bạn thấy tại thời điểm đó.
Đối với giao dịch XÓA của bạn, mỗi và mọi bản ghi được xác định theo điều kiện truy vấn của bạn, sẽ được đánh dấu để xóa. Vì các máy khách khác có thể đang truy cập dữ liệu cùng lúc, nó không thể xóa chúng khỏi bảng ngay lập tức vì họ phải xem ảnh chụp nhanh tương ứng để đảm bảo tính nguyên tử của việc xóa.
Khi tất cả các bản ghi đã được đánh dấu để xóa, giao dịch được cam kết thành công. Và thậm chí sau đó chúng không thể bị xóa ngay lập tức khỏi các trang dữ liệu thực tế, trước khi tất cả các giao dịch khác hoạt động với giá trị ảnh chụp nhanh trước khi giao dịch DELETE của bạn cũng kết thúc.
Vì vậy, trên thực tế, 3 phút của bạn không thực sự chậm như vậy, vì thực tế là tất cả các bản ghi phải được sửa đổi để chuẩn bị xóa chúng một cách an toàn trong giao dịch. Có thể bạn sẽ "nghe thấy" đĩa cứng của bạn hoạt động trong khi câu lệnh chạy. Điều này là do truy cập vào tất cả các hàng. Record. Với bộ nhớ bổ sung, InnoDB có thể đọc bảng của bạn (hầu hết) vào bộ nhớ và tránh mất thời gian tìm kiếm đĩa.