Phân trang hiệu quả trong SQLite với hàng triệu bản ghi


102

Tôi cần hiển thị kết quả SQLite ở dạng xem danh sách. Tất nhiên, tôi cần trang kết quả.

Tùy chọn đầu tiên là sử dụng điều khoản LIMIT. Ví dụ:

SELECT * FROM Table LIMIT 100, 5000

Nó trả về các bản ghi 5001 đến 5100. Vấn đề là SQLite nội bộ "đọc" 5000 bản ghi đầu tiên và nó không quá hiệu quả.

Cách tốt nhất để phân trang khi có rất nhiều bản ghi là gì?

Câu trả lời:


118

Xin lưu ý rằng bạn luôn phải sử dụng một ORDER BYmệnh đề; nếu không, thứ tự là tùy ý.

Để phân trang hiệu quả, hãy lưu các giá trị được hiển thị đầu tiên / cuối cùng của (các) trường có thứ tự và tiếp tục ngay sau chúng khi hiển thị trang tiếp theo:

SELECT *
FROM MyTable
WHERE SomeColumn > LastValue
ORDER BY SomeColumn
LIMIT 100;

(Điều này được giải thích chi tiết hơn trên SQLite wiki .)

Khi bạn có nhiều cột sắp xếp (và SQLite 3.15 trở lên), bạn có thể sử dụng so sánh giá trị hàng cho việc này:

SELECT *
FROM MyTable
WHERE (SomeColumn, OtherColumn) > (LastSome, LastOther)
ORDER BY SomeColumn, OtherColumn
LIMIT 100;

8
Còn về trường hợp bạn có 101 giá trị giống nhau trong SomeColumn thì sao? Điều này có vẻ tốt hơn: blog.ssokolow.com/archives/2009/12/23/...
Jacek Ławrynowicz

6
@ JacekŁawrynowicz Nếu cột sắp xếp không phải là duy nhất, bạn cần sắp xếp theo nhiều cột hơn. Dù sao, nếu bạn có một câu trả lời thay thế, hãy tạo một câu trả lời.
CL.

@CL nếu tôi muốn thực hiện việc này với truy vấn tham gia thì cách thực hiện với nhiều điều kiện AND
YLS

@YLS Ngày nay, bạn có thể sử dụng các giá trị hàng.
CL.

2
Vấn đề sử dụng phương pháp này là giải thích ngắn gọn bằng cách nhận xét này
mr5
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.