LaravelのページネーションはcursorPaginateを利用するべき

Laravel

ページネーションにはカーソルページングが良いです。

これはドキュメントでも説明がされています

paginatesimplePaginateがSQLの”offset”句を使用してクエリを作成するのに対し、カーソルペジネーションは “where”句を使い制約し、効率的なデータベースパフォーマンスを実現します。このペジネーションの方法は、特に大規模なデータセットや、「無限」にスクロールするユーザーインターフェイスに適しています。

https://readouble.com/laravel/8.x/ja/pagination.html

それぞれ下記の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がないように気をつけなければなりません。

ぎゅう
WEBエンジニア
渋谷でWEBエンジニアとして働く。
LaravelとVue.jsをよく取り扱い、誰でも仕様が伝わるコードを書くことを得意とする。
先輩だろうがプルリクにコメントをして、リファクタしまくる仕様伝わるコード書くマン
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次
閉じる