ページネーション: offset と cursor の違い
offset
データセットから特定の位置(オフセット)から始まるデータのサブセットを取得する方法
クライアントは、どのoffsetから始めるかと、一度にいくつの項目を取得するか(limit)を指定
メリット:何番目のこれください! とか
デメリット:データセットが大きくなると、パフォーマンスに問題が生じる可能性があります。ページ数が大きくなるほど、データベースがスキップする必要がある行の数が増え、クエリの実行時間が長くなることがある
例
ブログ記事のサイトで、1ページにつき10記事表示させる場合
1ページ目の10記事をがほしい → offset 0 , limit 10
SELECT * FROM articles ORDER BY creation_date ASC LIMIT 10 OFFSET 0
2ページ目の10記事がほしい → offset 10 , limit 10
SELECT * FROM articles ORDER BY creation_date ASC LIMIT 10 OFFSET 10
offsetの数:1ページ目の10記事をスキップして取りたいのでスキップしたい数をoffsetに設定
limitの数:1ページあたりに表示させたいデータの数を指定
cursor
データセットを順にトラバースするために「カーソル」と呼ばれるポインターを使用します。カーソルは、データセット内の特定の位置を示す値(例えば、最後に取得した項目のID)
最後に取得した項目の一意の識別子(カーソル)を使用して、次のデータセットを取得する
例
最初のリクエスト:最初の10記事を limit だけ指定して 普通に取得する
SELECT * FROM articles ORDER BY creation_date ASC LIMIT 10
↑このクエリの結果、最後の10記事目のidが 15 だとする。
次のリクエストで、このidを使ってそれ以降の記事を取得する。
SELECT * FROM articles WHERE id > 15 ORDER BY creation_date ASC LIMIT 10
ORDER BY creation_date で並び替えて、 idが 15より後の記事を10個取得している
取得した最後のid がカーソル