Technology

Pagination Toolbox

On this page

Interview Trigger

Feed / Posts / Transactions / History / Orders / Search / 100M rows
→ Pagination

为什么不能直接 LIMIT 20?

SELECT * FROM transaction LIMIT 20 OFFSET 1000000;
-- 数据库还是要 Scan → Skip 1000000 rows → Return 20
-- Offset 越大越慢

两种 Pagination

1. Offset Pagination

LIMIT 20 OFFSET 40

优点:简单,可以跳到第 N 页。

缺点:Offset 大会变慢;新数据插入后容易重复/遗漏。

2. Cursor Pagination (推荐)

SELECT * FROM transaction
WHERE id < last_seen_id
ORDER BY id DESC
LIMIT 20;

不会重复,效率 O(logN + limit)。


Cursor 可以是什么?

ID / Timestamp / (created_at, id)

金融通常用 created_at + id,因为 Timestamp 可能一样。


Interview Follow-up

什么时候不用 Offset?

Large Dataset / Feed / Timeline / History → Cursor

什么时候 Offset 可以?

Admin 后台 / 1000 rows → 完全没问题