原文地址:We need tool support for keyset pagination
1、offset的定义
…the rows are first sorted according to the <order by clause> and then limited by dropping the number of rows specified in the <result offset clause> from the beginning…
SQL:2016, Part 2, §4.15.3 Derived tables
可以简单理解为:查询数据排序完后,使用游标读取数据,offset之前的数据全部“丢弃”掉,取出limit条数据即可。
2、offset分页的问题
2.1 性能影响(深度分页)
例如:每页100条数据,要获取第101页的数据,等价于select xxx from table offset 10000 limit 100。实际上数据库还是需要取出10100条数据,只不过是“丢弃”了前10000条,然后获取后面100条。
2.2 业务功能上的困扰
下图可以清晰的反映这个问题,如图:
由于第二步新纪录的插入,导致同一条数据出现在第一页(最后一条数据)和第二页(第一条数据)。
3、抛弃offset(Life Without Offset)
如何不使用offset进行分页? 我们可以通过查询条件告诉数据库“上次看到哪里了”,然后接着看。
例如:
SELECT ...
FROM ...
WHERE ...
AND id < ?last_seen_id
ORDER BY id DESC
FETCH FIRST 10 ROWS ONLY
这里同样支持“多个字段排序的情况”。
注意:这种方案的限制是——不能跳到指定的“页”,只能一页一页的翻。
参考:Pagination done the Right Way
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架