Bảng có một khóa chính. Hãy tận dụng nó.
Thay vì LIMIT
và OFFSET
, thực hiện phân trang của bạn với một bộ lọc trên khóa chính. Bạn đã gợi ý về điều này với nhận xét của mình:
Phân trang bằng cách sử dụng các số ngẫu nhiên (Thêm "LỆNH HƠN THEO LỆNH" vào mỗi truy vấn)
nhưng không có gì ngẫu nhiên về cách bạn nên làm điều đó.
SELECT * FROM big_table WHERE id > $1 ORDER BY id ASC LIMIT $2
Cho phép ứng dụng chỉ định cả hai tham số, ID cuối cùng mà ứng dụng nhìn thấy và số lượng bản ghi cần tìm nạp. API của bạn sẽ phải có trình giữ chỗ, tham số bổ sung hoặc lệnh gọi thay thế cho "tìm nạp đầu tiên n ID "trong đó nó bỏ qua WHERE
mệnh đề từ truy vấn, nhưng điều đó không đáng kể.
Cách tiếp cận này sẽ sử dụng quét chỉ mục khá hiệu quả để sắp xếp các bản ghi, nói chung tránh được việc sắp xếp hoặc cần phải lặp lại tất cả các bản ghi đã bỏ qua. Máy khách có thể quyết định có bao nhiêu hàng cùng một lúc.
Cách tiếp cận này khác với LIMIT
và OFFSET
tiếp cận theo một cách chính:sửa đổi đồng thời. Nếu bạn INSERT
vào bảng bằng phím thấp hơn so với một khóa mà một số khách hàng đã thấy, cách tiếp cận này sẽ không thay đổi kết quả của nó, trong khi OFFSET
cách tiếp cận sẽ lặp lại một hàng. Tương tự, nếu bạn DELETE
một hàng có ID thấp hơn đã thấy, kết quả của phương pháp này sẽ không thay đổi, trong khi OFFSET
sẽ bỏ qua một hàng không nhìn thấy. Tuy nhiên, không có sự khác biệt đối với các bảng chỉ thêm vào với các khóa được tạo.
Nếu bạn biết trước rằng khách hàng sẽ muốn toàn bộ tập hợp kết quả, điều hiệu quả nhất cần làm là chỉ cần gửi cho họ toàn bộ tập kết quả mà không có nghiệp vụ phân trang này. Đó là nơi tôi sẽ sử dụng con trỏ. Đọc các hàng từ DB và gửi chúng đến máy khách nhanh nhất khi máy khách chấp nhận chúng. API này sẽ cần đặt giới hạn về mức độ chậm cho phép của ứng dụng khách để tránh tải phụ trợ quá mức; đối với một ứng dụng khách chậm, tôi có thể sẽ chuyển sang phân trang (như mô tả ở trên) hoặc chuyển toàn bộ kết quả con trỏ ra một tệp tạm thời và đóng kết nối DB.
Cảnh báo quan trọng :
- Yêu cầu
UNIQUE
ràng buộc /UNIQUE
chỉ mục hoặcPRIMARY KEY
đáng tin cậy - Các hành vi sửa đổi đồng thời khác nhau để giới hạn / bù đắp, xem ở trên