Hãy để tôi viết lại những điều từ nhận xét đến câu trả lời của tôi. Bạn muốn sử dụng timestamp
nhập thay vì integer
đơn giản vì đó chính xác là những gì nó được thiết kế. Thực hiện chuyển đổi thủ công giữa các số nguyên dấu thời gian và timestamp
đối tượng chỉ là một nỗi đau và bạn không đạt được gì. Và cuối cùng bạn sẽ cần nó cho các truy vấn dựa trên ngày giờ phức tạp hơn.
Để trả lời một câu hỏi về phân trang. Bạn chỉ cần thực hiện một truy vấn
SELECT *
FROM table_name
WHERE created < lastTimestamp
ORDER BY created DESC
LIMIT 30
Nếu đó là truy vấn đầu tiên thì bạn đặt nói lastTimestamp = '3000-01-01'
. Nếu không, bạn đặt lastTimestamp = last_query.last_row.created
.
Tối ưu hóa
Lưu ý rằng nếu bảng lớn thì ORDER BY created DESC
có thể không hiệu quả (đặc biệt nếu được gọi song song với các phạm vi khác nhau). Trong trường hợp này, bạn có thể sử dụng "cửa sổ thời gian" di chuyển, ví dụ:
SELECT *
FROM table_name
WHERE
created < lastTimestamp
AND created >= lastTimestamp - interval '1 day'
1 day
khoảng thời gian được chọn tùy ý (điều chỉnh nó theo nhu cầu của bạn). Bạn cũng có thể sắp xếp kết quả trong ứng dụng.
Nếu kết quả không trống thì bạn cập nhật (trong ứng dụng của bạn)
lastTimestamp = last_query.last_row.created
(giả sử bạn đã sắp xếp xong, nếu không, bạn mất min(last_query.row.created)
)
Nếu kết quả trống thì bạn lặp lại truy vấn với lastTimestamp = lastTimestamp - interval '1 day'
cho đến khi bạn tìm nạp một thứ gì đó. Ngoài ra, bạn phải dừng nếu lastTimestamp
trở nên thấp, tức là khi nó thấp hơn thì bất kỳ dấu thời gian nào khác trong bảng (phải được tìm nạp trước).
Tất cả những điều đó đều nằm trong một số giả định cho việc chèn:
-
new_row.created >= any_row.created
và -
new_row.created ~ current_time
- Việc phân phối
new_row.created
ít nhiều đều đồng nhất
Giả định 1 đảm bảo rằng việc phân trang dẫn đến dữ liệu nhất quán trong khi giả định 2 chỉ cần thiết cho 3000-01-01
mặc định ngày. Giả định 3 là đảm bảo rằng bạn không có những khoảng trống lớn khi bạn phải đưa ra nhiều truy vấn trống.