PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Làm thế nào để cung cấp một ứng dụng khách API với 1.000.000 kết quả cơ sở dữ liệu?

Bảng có một khóa chính. Hãy tận dụng nó.

Thay vì LIMITOFFSET , 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 LIMITOFFSET 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ặc PRIMARY 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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm thế nào để xóa triệt để và cài đặt lại postgresql trên ubuntu?

  2. 4 cách để chọn hàng trùng lặp trong PostgreSQL

  3. Django, mod_wsgi, psycopg2 Không đúng Định cấu hình:Lỗi khi tải mô-đun psycopg2:Không có mô-đun nào có tên _psycopg

  4. UUID hoặc SEQUENCE cho khóa chính?

  5. Không thể kết nối với postgres từ máy chủ từ xa