コメントから私の答えに書き直させてください。 timestamp
を使用したい integer
の代わりに入力する それがまさにそれが設計されたものだからです。タイムスタンプ整数とtimestamp
の間で手動変換を行う オブジェクトはただの苦痛であり、あなたは何も得ません。そして、最終的には、より複雑な日時ベースのクエリに必要になります。
改ページについての質問に答えるため。クエリを実行するだけです
SELECT *
FROM table_name
WHERE created < lastTimestamp
ORDER BY created DESC
LIMIT 30
最初のクエリの場合は、たとえばlastTimestamp = '3000-01-01'
を設定します。 。それ以外の場合は、lastTimestamp = last_query.last_row.created
を設定します 。
最適化
テーブルが大きい場合は、ORDER BY created DESC
に注意してください。 効率的でない可能性があります(特に、異なる範囲で並列に呼び出された場合)。この場合、移動する「タイムウィンドウ」を使用できます。例:
SELECT *
FROM table_name
WHERE
created < lastTimestamp
AND created >= lastTimestamp - interval '1 day'
1 day
間隔は任意に選択されます(必要に応じて調整してください)。アプリで結果を並べ替えることもできます。
結果が空でない場合は、(アプリで)更新します
lastTimestamp = last_query.last_row.created
(並べ替えが完了していると仮定します。それ以外の場合は、min(last_query.row.created)
を使用します。 )
結果が空の場合は、lastTimestamp = lastTimestamp - interval '1 day'
を使用してクエリを繰り返します。 あなたが何かをフェッチするまで。また、lastTimestamp
の場合は、停止する必要があります 低くなります。つまり、テーブル内の他のタイムスタンプ(プリフェッチする必要があります)よりも低くなります。
これらはすべて、挿入に関するいくつかの仮定の下にあります。
-
new_row.created >= any_row.created
および -
new_row.created ~ current_time
-
new_row.created
の配布 多かれ少なかれ均一です
仮定1は、ページネーションによって一貫したデータが得られることを保証しますが、仮定2は、デフォルトの3000-01-01
にのみ必要です。 日にち。仮定3は、多くの空のクエリを発行する必要があるときに、大きな空のギャップがないことを確認することです。