ページネーションにはカーソルページングが良いです。
これはドキュメントでも説明がされています
https://readouble.com/laravel/8.x/ja/pagination.html
paginate
とsimplePaginate
がSQLの”offset”句を使用してクエリを作成するのに対し、カーソルペジネーションは “where”句を使い制約し、効率的なデータベースパフォーマンスを実現します。このペジネーションの方法は、特に大規模なデータセットや、「無限」にスクロールするユーザーインターフェイスに適しています。
それぞれ下記のSQLでの差が生まれます。
# オフセットページング
select * from users order by id asc limit 15 offset 15;
# カーソルページング
select * from users where id > 15 order by id asc limit 15;
大きな差はoffsetを使うか、where文で絞り込むかの違いです。
なぜカーソルページネーションを利用するべきか?
offsetは必要なページにたどり着くまでに、最初からそこまでの全ての行を数える必要があるため、後のページになればなるほど応答が悪くなります。
逆にカーソルページングはwhere id > 15
とすることで、14行目までは数える必要はありません。
もちろんindexを使用している前提ではあります。
simplePaginate()とpaginate()はoffsetを利用してるため、軽くするためにページネーションを利用してもoffsetの特性により重いままです。
そのため、cursorPaginateを利用するべきです。
カーソルページネーションのデメリット
カーソルのペジネーションは”次へ”と”前へ”のリンクを表示するためにのみ使用でき、ページ番号付きのリンクの生成をサポートしていません。
そのため、ページ番号が必要な要件には合わないです。
また、ソート順は少なくとも1つの一意なカラム、または一意なカラムの組み合わせに基づく必要があります。null
値を持つカラムはサポートしていません。whereで絞り込みをしているので、当然ですよね
そのため、設計時の段階でnullがないように気をつけなければなりません。
コメント