文章摘要
......为什么使用游标分页
传统的LIMIT-OFFSET分页方式,是采用的跳过n个数据的方式实现分页,这就导致分页越到后面就会越慢。
而游标分页的工作原理是记住上一页最后一条记录的排序字段值作为游标(cursor),下一页直接从游标位置继续取。所以游标分页不管翻到第几页,时间复杂度都是 O(1) ,速度也都是差不多的。
游标分页适合什么场景
-
数据量大、深度分页性能要求高(比如无限滚动加载)
-
数据频繁插入/更新、要求数据不会重复也不会漏看的场景
-
可以接受不跳页、总条数、总页数,但追求性能稳定和一致性
为什么游标分页更适合频繁插入/更新的场景?
因为游标分页的使用场景一般是最新的数据排在前面的场景,也就是id或者时间是递减的。假设我们在翻页时,新增了一条数据,那么也不影响我们查看下一条数据。至于新增的数据,刷新列表它就会出现在最前面,符合操作习惯。而使用传统的LIMIT-OFFSET分页的话,在这种场景下,刚才看过数据,就会在下一页又看到这个数据。
如何使用游标分页
使用前提
由于游标分页是根据顺序来标识分页的,所以你的数据必须是按时间或自增 ID 倒序(即最新的数据在第一页),当然反之亦然。
简单用法
简单使用场景:
-- 第一页
SELECT * FROM t_ahzoo ORDER BY id DESC LIMIT 20;
-- 假设第一页最后一条数据的id是999
-- 而你的id又是递减的,那么第二页的数据就可以查询id小于999的数据
-- 下一页
SELECT * FROM t_ahzoo
WHERE id < 999
ORDER BY id DESC
LIMIT 20;
复杂的场景:
SELECT * FROM t_ahzoo
WHERE (price < 上一页最后一条数据的价格)
OR (price = 上一页最后一条数据价格 AND id < 上一页最后一条数据的ID)
ORDER BY price DESC, id DESC
LIMIT 20;
需要注意的细节
-
用于分页的”游标“存在哪里?
-
游标通常直接存在前端。但是游标作为分页的关键信息,存在前端的话,必须要避免数据被篡改,防止前端通过修改游标信息恶意探测数据。或者也可以选择直接存在后端缓存,但是一般没这个必要。
-
总结
可以看到,游标分页更像是一种思想,或者说是一种解决方案。这也就意味着,你在其它数据库也能够使用这套方案,而不仅局限于本文示例的MySQL。
版权声明
本文依据 CC-BY-NC-SA 4.0 许可协议授权,请您在转载时注明文章来源为 Z次元 ,若本文涉及转载第三方内容,请您一同注明。
知识积累
人非生而知之者,孰能无惑?惑而不从师,其为惑也,终不解矣。
评论区
目录
1
为什么使用游标分页
2
游标分页适合什么场景
3
如何使用游标分页
使用前提
简单用法
4
需要注意的细节
5
总结