Như bạn đã trình bày, MySQL có hai kế hoạch truy vấn thay thế cho các truy vấn có ORDER BY ... LIMIT n
:
- Đọc tất cả các hàng đủ điều kiện, sắp xếp chúng và chọn n hàng trên cùng.
- Đọc các hàng theo thứ tự đã sắp xếp và dừng lại khi n hàng đủ điều kiện đã được tìm thấy.
Để quyết định tùy chọn nào tốt hơn, trình tối ưu hóa cần ước tính hiệu quả lọc của điều kiện WHERE của bạn. Điều này không dễ hiểu, đặc biệt là đối với các cột không được lập chỉ mục hoặc đối với các cột có các giá trị tương quan với nhau. Trong trường hợp của bạn, người ta có thể phải đọc nhiều bảng hơn theo thứ tự được sắp xếp để tìm 25 hàng đủ điều kiện đầu tiên so với những gì trình tối ưu hóa mong đợi.
Đã có một số cải tiến về cách xử lý LIMIT truy vấn, cả trong các bản phát hành sau của 5.6 (bạn đang chạy trên bản phát hành trước GA!) Và trong các bản phát hành mới hơn (5.7, 8.0). Tôi khuyên bạn nên thử nâng cấp lên bản phát hành sau và xem liệu đây có còn là sự cố không.
Nói chung, nếu bạn muốn hiểu các quyết định của người lập kế hoạch truy vấn, bạn nên xem dấu vết của trình tối ưu hóa cho truy vấn.