2013-01-22 16 views
63

Tôi cần hiển thị kết quả SQLite trong chế độ xem danh sách. Tất nhiên, tôi cần phải trang kết quả.Phân trang hiệu quả trong SQLite với hàng triệu bản ghi

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

SELECT * FROM Table LIMIT 100, 5000 

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

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

+11

tắm upvote dành cho nam giới tioning những bất lợi của LIMIT A, B! :) –

Trả lời

78

Xin lưu ý rằng bạn luôn phải sử dụng mệnh đề ORDER BY; nếu không, bạn chỉ nhận được một số thứ tự ngẫu nhiên.

Để làm phân trang hiệu quả, tiết kiệm đầu tiên/cuối cùng hiển thị giá trị của trường đã ra lệnh (s), và tiếp tục ngay sau khi họ khi hiển thị trang tiếp theo:

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

(này được giải thích chi tiết hơn on the SQLite wiki .)

Khi bạn có nhiều cột loại (và SQLite 3,15 hoặc mới hơn), bạn có thể sử dụng một row value comparison cho việc này:

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

Bí quyết tuyệt vời, không biết về điều này. Và cảm ơn cho các liên kết, rất thông tin! –

+4

Còn 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: http://blog.ssokolow.com/archives/2009/12/23/sql-pagination-without-offset/ –

+4

@ 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ó câu trả lời thay thế, hãy tạo câu trả lời. –

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