LIMIT với độ lệch cực kỳ chậm trong hầu hết các cơ sở dữ liệu (Tôi đã tìm thấy một số tài liệu hiệu ứng này cho MySQL và tôi đang cố gắng tìm một bài báo thực sự tốt mà tôi đã đọc một thời gian trước giải thích điều này cho SQLite). Lý do là nó thường được triển khai một cái gì đó như thế này:
- Thực hiện tất cả lập kế hoạch truy vấn bình thường như thể
LIMIT
mệnh đề không có ở đó - Xem qua kết quả cho đến khi chúng tôi nhận được chỉ mục bạn muốn
- Bắt đầu trả về kết quả
Điều này có nghĩa là gì nếu bạn thực hiện LIMIT 10000, 10
, nó sẽ được hiểu là:
- Tìm nạp 10.000 kết quả đầu tiên và bỏ qua chúng
- Cung cấp cho bạn 10 kết quả tiếp theo
Có một cách tối ưu hóa tầm thường mà ít nhất bạn có thể sử dụng chỉ mục cho 10.000 kết quả đầu tiên vì bạn không quan tâm đến giá trị của chúng, nhưng ngay cả trong trường hợp đó, cơ sở dữ liệu vẫn cần xem qua 10.000 giá trị chỉ mục trước khi cung cấp cho bạn 10 kết quả. Có thể có những tối ưu hóa hơn nữa có thể cải thiện điều này, nhưng trong trường hợp chung bạn không muốn sử dụng LIMIT
với phần bù cho các giá trị lớn .
Cách hiệu quả nhất để xử lý phân trang mà tôi biết là theo dõi chỉ mục cuối cùng, vì vậy nếu trang một kết thúc ở id = 5
, sau đó thực hiện tiếp theo của bạn liên kết có WHERE id > 5
(với LIMIT x
tất nhiên).
CHỈNH SỬA:Đã tìm thấy bài viết cho SQLite . Tôi thực sự khuyên bạn nên đọc phần này vì nó giải thích The Right Way ™ để thực hiện các công việc trong SQL. Vì những người sử dụng SQLite thực sự thông minh và các cơ sở dữ liệu khác có cùng vấn đề này, tôi giả sử MySQL triển khai điều này theo cách tương tự.