Zenn
Open5

ページング実装の検討メモ

miyatakamiyataka

前提

ここでいうページング(paging)処理というと,WebAPIで,大量のアイテムを,ある順序で部分的に繰り返し取得する処理のことをいう

miyatakamiyataka

選択肢

選択肢としては以下の二つがあるとする.

  • オフセットページング (offset paging)
  • カーソルページング (cursor paging)
miyatakamiyataka

オフセットページング

データベースをクエリする際,以下のようなクエリを発行する.

SELECT *
FROM a_table
ORDER BY a_column
LIMIT <page_size>
OFFSET <offset>;

クエリ観点からすれば,必要なインプットは,1. ページサイズに相当するLIMITと,2. 先頭からどれだけずらした箇所を取得するかというOFFSET の2つ

これはユーザー視点に置き換えると,ページ番号とページサイズと解釈できる

メリット

  • ユーザーにとっても,開発者にとっても解釈しやすい
  • 別途レコードの件数を取得すれば,全体の件数とページは何ページあるのかが簡単にわかる
  • 比較的ソートに対する柔軟性が比較的高い

デメリット

  • オフセットが増えると(後ろのほうのページを参照すると)その分スキャンするレコード量が増えて,性能が劣化することになる,
  • レコードがINSERTされると,表示がずれる
miyatakamiyataka

カーソルページング

データベースをクエリする際,以下のようなクエリを発行する.

SELECT *
FROM a_table
WHERE a_column > <cursor>
ORDER BY a_column
LIMIT <page_size>;

クエリ観点からすれば,必要なインプットは,1. ページサイズに相当するLIMITと,2. どこ以降(あるいは以前)から取得するかのカーソル の2つ

ユーザーからすると,無限スクロールのUIで,スクロールすると次々に読み込まれるようなあの挙動

メリット

  • レコードが途中でINSERTされても表示がずれない
  • クエリの性能が劣化しづらい

デメリット

  • 「前のページ」の実装が比較的複雑になる
  • ページ番号を利用するようなUIだと対応するカーソルを算出するのが難しい
作成者以外のコメントは許可されていません