Dovolte mi přepsat věci z komentářů k mé odpovědi. Chcete použít timestamp
zadejte místo integer
prostě proto, že přesně k tomu byl navržen. Provádění manuálních převodů mezi celými čísly časového razítka a timestamp
objekty je jen bolest a nic nezískáte. A nakonec jej budete potřebovat pro složitější dotazy založené na datu a času.
Odpověď na otázku týkající se stránkování. Stačí zadat dotaz
SELECT *
FROM table_name
WHERE created < lastTimestamp
ORDER BY created DESC
LIMIT 30
Pokud je to první dotaz, nastavte řekněte lastTimestamp = '3000-01-01'
. Jinak nastavíte lastTimestamp = last_query.last_row.created
.
Optimalizace
Všimněte si, že pokud je stůl velký, pak ORDER BY created DESC
nemusí být efektivní (zejména pokud je volán paralelně s různými rozsahy). V tomto případě můžete použít pohyblivá "časová okna", například:
SELECT *
FROM table_name
WHERE
created < lastTimestamp
AND created >= lastTimestamp - interval '1 day'
1 day
interval je zvolen libovolně (vylaďte jej podle svých potřeb). Výsledky můžete také třídit v aplikaci.
Pokud výsledky nejsou prázdné, aktualizujte (ve své aplikaci)
lastTimestamp = last_query.last_row.created
(za předpokladu, že jste provedli třídění, jinak budete potřebovat min(last_query.row.created)
)
Pokud jsou výsledky prázdné, zopakujte dotaz s lastTimestamp = lastTimestamp - interval '1 day'
dokud něco neseženeš. Také musíte zastavit, pokud lastTimestamp
stane se nízkou, tj. když je nižší než jakékoli jiné časové razítko v tabulce (které je třeba načíst předem).
To vše je za určitých předpokladů pro vložky:
new_row.created >= any_row.created
anew_row.created ~ current_time
- Distribuce
new_row.created
je víceméně jednotný
Předpoklad 1 zajišťuje, že stránkování povede ke konzistentním datům, zatímco předpoklad 2 je potřeba pouze pro výchozí 3000-01-01
datum. Předpoklad 3 je zajistit, abyste neměli velké prázdné mezery, když musíte zadávat mnoho prázdných dotazů.