Biarkan saya menulis ulang hal-hal dari komentar untuk jawaban saya. Anda ingin menggunakan timestamp
ketik alih-alih integer
hanya karena untuk itulah ia dirancang. Melakukan konversi manual antara bilangan bulat stempel waktu dan timestamp
objek hanyalah rasa sakit dan Anda tidak mendapatkan apa-apa. Dan pada akhirnya Anda akan membutuhkannya untuk kueri berbasis datetime yang lebih kompleks.
Untuk menjawab pertanyaan tentang pagination. Anda cukup melakukan kueri
SELECT *
FROM table_name
WHERE created < lastTimestamp
ORDER BY created DESC
LIMIT 30
Jika ini adalah kueri pertama maka Anda menetapkan mengatakan lastTimestamp = '3000-01-01'
. Jika tidak, Anda menyetel lastTimestamp = last_query.last_row.created
.
Pengoptimalan
Perhatikan bahwa jika tabelnya besar maka ORDER BY created DESC
mungkin tidak efisien (terutama jika disebut secara paralel dengan rentang yang berbeda). Dalam hal ini Anda dapat menggunakan "jendela waktu" yang bergerak, misalnya:
SELECT *
FROM table_name
WHERE
created < lastTimestamp
AND created >= lastTimestamp - interval '1 day'
1 day
interval dipilih secara sewenang-wenang (sesuaikan dengan kebutuhan Anda). Anda juga dapat mengurutkan hasil di aplikasi.
Jika hasilnya tidak kosong maka Anda memperbarui (di aplikasi Anda)
lastTimestamp = last_query.last_row.created
(dengan asumsi Anda telah selesai menyortir, jika tidak, Anda mengambil min(last_query.row.created)
)
Jika hasil kosong maka ulangi kueri dengan lastTimestamp = lastTimestamp - interval '1 day'
sampai Anda mengambil sesuatu. Anda juga harus berhenti jika lastTimestamp
menjadi terlalu rendah, yaitu saat lebih rendah dari stempel waktu lainnya dalam tabel (yang harus diambil terlebih dahulu).
Semua itu di bawah beberapa asumsi untuk sisipan:
new_row.created >= any_row.created
dannew_row.created ~ current_time
- Distribusi
new_row.created
kurang lebih seragam
Asumsi 1 memastikan bahwa pagination menghasilkan data yang konsisten sementara asumsi 2 hanya diperlukan untuk 3000-01-01
default tanggal. Asumsi 3 adalah untuk memastikan bahwa Anda tidak memiliki celah kosong yang besar ketika Anda harus mengeluarkan banyak kueri kosong.