1. 基于游标的分页模式,cursor-based pagination?
什么是基于游标的分页(cursor-based pagination)?它与传统的 OFFSET/LIMIT 分页有何区别?
- 游标分页的定位方式(基于排序键定位而非偏移量)
- 与 OFFSET 分页在性能、一致性上的差异
- 适用场景与限制
游标分页是在排序键上通过 WHERE 条件定位"上一页最后一条记录之后"的方式,而不是通过 OFFSET 跳过若干行。例如按 id 排序时,用 WHERE id > last_id ORDER BY id LIMIT 20 取下一页。所有页共用同一索引,因此每一页都从索引定位点开始扫描,不会像 OFFSET 那样逐页丢弃前面已读过的行,从而避免深分页时的性能退化。游标分页天然稳定,即使数据在翻页期间被插入或删除,也不会出现"重复或跳行"的问题,因为它是基于排序键位置而不是固定偏移量。
OFFSET 分页的代价随页数线性增长(每页都要扫描并丢弃 offset 行),而游标分页每次只扫描一页,复杂度稳定。它的代价是只能顺序翻页(next/prev),无法随意跳页,且要求排序键唯一稳定。
-- OFFSET 深分页:第 10000 页,需扫描并丢弃 200000 行
SELECT * FROM orders ORDER BY id LIMIT 20 OFFSET 200000;
-- 游标分页:基于 id 定位,每页只扫描 20 行
SELECT * FROM orders WHERE id > 200000 ORDER BY id LIMIT 20;