原文地址:We need tool support for keyset paginationsql
一、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…ide
SQL:2016, Part 2, §4.15.3 Derived tablespost
能够简单理解为:查询数据排序完后,使用游标读取数据,offset以前的数据所有“丢弃”掉,取出limit条数据便可。性能
二、offset分页的问题.net
2.1 性能影响(深度分页)postgresql
例如:每页100条数据,要获取第101页的数据,等价于select xxx from table offset 10000 limit 100。实际上数据库仍是须要取出10100条数据,只不过是“丢弃”了前10000条,而后获取后面100条。blog
2.2 业务功能上的困扰排序
下图能够清晰的反映这个问题,如图:ci
因为第二步新纪录的插入,致使同一条数据出如今第一页(最后一条数据)和第二页(第一条数据)。
三、抛弃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