Pozwólcie, że przepiszę rzeczy od komentarzy do mojej odpowiedzi. Chcesz użyć timestamp
wpisz zamiast integer
po prostu dlatego, że właśnie do tego został zaprojektowany. Wykonywanie ręcznych konwersji między liczbami całkowitymi znacznika czasu a timestamp
przedmioty to tylko ból i nic nie zyskujesz. I w końcu będziesz go potrzebować do bardziej złożonych zapytań opartych na datach i godzinach.
Aby odpowiedzieć na pytanie o paginację. Wystarczy wykonać zapytanie
SELECT *
FROM table_name
WHERE created < lastTimestamp
ORDER BY created DESC
LIMIT 30
Jeśli jest to pierwsze zapytanie, ustaw powiedz lastTimestamp = '3000-01-01'
. W przeciwnym razie ustawisz lastTimestamp = last_query.last_row.created
.
Optymalizacja
Zauważ, że jeśli tabela jest duża, to ORDER BY created DESC
może nie być wydajne (zwłaszcza jeśli wywołane równolegle z różnymi zakresami). W takim przypadku możesz użyć ruchomych „okien czasowych”, na przykład:
SELECT *
FROM table_name
WHERE
created < lastTimestamp
AND created >= lastTimestamp - interval '1 day'
1 day
interwał jest wybierany dowolnie (dostosuj go do swoich potrzeb). Możesz także sortować wyniki w aplikacji.
Jeśli wyniki nie są puste, aktualizujesz (w swojej aplikacji)
lastTimestamp = last_query.last_row.created
(zakładając, że wykonałeś sortowanie, w przeciwnym razie zajmiesz min(last_query.row.created)
)
Jeśli wyniki są puste, powtarzasz zapytanie z lastTimestamp = lastTimestamp - interval '1 day'
dopóki czegoś nie przyniesiesz. Musisz także zatrzymać się, jeśli lastTimestamp
staje się zbyt niski, tj. gdy jest niższy niż jakikolwiek inny znacznik czasu w tabeli (który musi być wstępnie pobrany).
Wszystko to odbywa się pod pewnymi założeniami dotyczącymi wkładek:
new_row.created >= any_row.created
inew_row.created ~ current_time
- Dystrybucja
new_row.created
jest mniej więcej jednolita
Założenie 1 zapewnia, że podział na strony daje spójne dane, podczas gdy założenie 2 jest potrzebne tylko dla domyślnego 3000-01-01
data. Założeniem 3 jest upewnienie się, że nie masz dużych pustych luk, gdy musisz wysłać wiele pustych zapytań.