API 設計: オフセット vs カーソルページネーション¶
元ネタ¶
- X: https://x.com/ashoKumar89/status/2040821776108904841
- 投稿者: @ashoKumar89
原文¶
Your API is paginating millions of records.
Offset-based pagination works fine… until it suddenly does not.
It gets slower as data grows yet most systems still use it.
When does it break, and when should you switch to cursor-based pagination?
要約¶
数百万件のレコードをページ分割する API で、オフセットベースのページネーションがデータ量の増加とともに遅くなる問題を指摘。カーソルベースに切り替えるべきタイミングを問う。
まずの答え¶
オフセットベース(OFFSET N LIMIT M)は、DB がスキップする行を全て読み飛ばす必要があるため、ページが深くなるほど遅くなる。カーソルベースは「前回の最後のレコードの ID(またはタイムスタンプ)」を基準にするため、どのページでも一定速度で取得できる。
切り替え判断の目安: - データ量が大きく、後ろのページへのアクセスが多い場合 - リアルタイムでデータが挿入/削除される場合(オフセットだとずれる)
深掘りしたい観点¶
- カーソルベースの実装パターン(keyset pagination)
- GraphQL の Relay-style cursor pagination
- オフセットでもインデックスで高速化できるケース
- Go での実装例
tags: #backend #api-design #pagination #database #performance