Lassen Sie mich Dinge von Kommentaren zu meiner Antwort umschreiben. Sie möchten timestamp
verwenden statt integer
eingeben einfach weil es genau dafür konzipiert wurde. Manuelle Konvertierungen zwischen Zeitstempel-Ganzzahlen und timestamp
Objekte ist nur ein Schmerz und Sie gewinnen nichts. Und Sie werden es eventuell für komplexere datetime-basierte Abfragen benötigen.
Um eine Frage zur Paginierung zu beantworten. Sie machen einfach eine Abfrage
SELECT *
FROM table_name
WHERE created < lastTimestamp
ORDER BY created DESC
LIMIT 30
Wenn es sich um die erste Abfrage handelt, setzen Sie beispielsweise lastTimestamp = '3000-01-01'
. Andernfalls setzen Sie lastTimestamp = last_query.last_row.created
.
Optimierung
Beachten Sie, dass wenn die Tabelle groß ist, ORDER BY created DESC
möglicherweise nicht effizient (insbesondere wenn sie parallel mit unterschiedlichen Reichweiten aufgerufen werden). In diesem Fall können Sie z. B. bewegliche "Zeitfenster" verwenden:
SELECT *
FROM table_name
WHERE
created < lastTimestamp
AND created >= lastTimestamp - interval '1 day'
Der 1 day
Intervall wird willkürlich ausgewählt (stimmen Sie es auf Ihre Bedürfnisse ab). Sie können die Ergebnisse auch in der App sortieren.
Wenn die Ergebnisse nicht leer sind, aktualisieren Sie (in Ihrer App)
lastTimestamp = last_query.last_row.created
(vorausgesetzt, Sie haben die Sortierung abgeschlossen, andernfalls benötigen Sie min(last_query.row.created)
)
Wenn Ergebnisse leer sind, wiederholen Sie die Abfrage mit lastTimestamp = lastTimestamp - interval '1 day'
bis du etwas geholt hast. Außerdem müssen Sie stoppen, wenn lastTimestamp
zu niedrig wird, d. h. wenn er niedriger ist als jeder andere Zeitstempel in der Tabelle (der vorab abgerufen werden muss).
All dies unterliegt einigen Annahmen für Einfügungen:
new_row.created >= any_row.created
undnew_row.created ~ current_time
- Die Verteilung von
new_row.created
ist mehr oder weniger einheitlich
Annahme 1 stellt sicher, dass die Paginierung zu konsistenten Daten führt, während Annahme 2 nur für den Standardwert 3000-01-01
benötigt wird Datum. Annahme 3 soll sicherstellen, dass Sie keine großen leeren Lücken haben, wenn Sie viele leere Abfragen ausgeben müssen.