Bảng có khóa chính. Hãy tận dụng nó.
Thay vì LIMIT
và OFFSET
, hãy phân trang với bộ lọc trên khóa chính. Bạn ám chỉ này với bình luận của bạn:
Paging sử dụng số ngẫu nhiên (Add "LỚN HƠN ORDER BY" cho 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 đó cả.
SELECT * FROM big_table WHERE id > $1 ORDER BY id ASC LIMIT $2
Cho phép khách hàng chỉ định cả thông số, ID cuối cùng mà số lần xem và số lượng bản ghi để tìm nạp. API của bạn sẽ phải có trình giữ chỗ, thông số bổ sung hoặc cuộc gọi thay thế cho "tìm nạp các ID đầu tiên n" nơi nó bỏ qua mệnh đề WHERE
từ truy vấn, nhưng điều đó không quan trọng.
Cách tiếp cận này sẽ sử dụng quét chỉ mục khá hiệu quả để lấy các bản ghi theo thứ tự, thường tránh bị sắp xếp hoặc cần phải lặp qua tất cả các bản ghi bị bỏ qua. Khách hàng có thể quyết định có bao nhiêu hàng nó muốn cùng một lúc.
Cách tiếp cận này khác với cách tiếp cận LIMIT
và OFFSET
theo một cách chính: sửa đổi đồng thời.Nếu bạn INSERT
vào bảng có khóa thấp hơn so với khóa mà một số khách hàng đã thấy, phương pháp này sẽ không thay đổi kết quả của nó, trong khi cách tiếp cận OFFSET
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 hàng không nhìn thấy. Mặc dù vậy, không có sự khác biệt nào cho các bảng chỉ nối thêm với các khóa được tạo ra.
Nếu bạn biết trước rằng khách hàng sẽ muốn toàn bộ kết quả, điều hiệu quả nhất cần làm là chỉ gửi cho họ toàn bộ kết quả được đặt không có doanh nghiệp 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 cho khách hàng nhanh như khách hàng sẽ chấp nhận chúng. API này sẽ cần phải đặt giới hạn về mức độ chậm của khách hàng được cho phép để tránh tải phụ trợ quá mức; cho một khách hàng chậm tôi có thể chuyển sang phân trang (như mô tả ở trên) hoặc spool toàn bộ con trỏ kết quả ra một tập tin tạm thời và đóng kết nối DB.
hãy cẩn thận quan trọng:
- Yêu cầu
UNIQUE
chế/UNIQUE
index hoặc PRIMARY KEY
là đáng tin cậy
- khác nhau hành vi đồng thời sửa đổi để hạn chế/bù đắp, xem ở trên
Nguồn
2012-10-30 23:57:18
Vấn đề với việc sử dụng OFFSET là nó yêu cầu máy chủ lặp lại toàn bộ tập kết quả trước "LIMIT", vì vậy nó phân tích cho các tập dữ liệu rất lớn. Tôi đã thực sự sử dụng một API đã làm điều này và chúng tôi đã gặp phải các vấn đề lớn khi nhận được dữ liệu sau khoảng 100.000 kết quả. –