跳到主要内容

游标翻页问题

普通的翻页就是前端会有一个分页条,可以指定一页的条数以及可以任意查看第几页

对应的参数是pageNo=5pageSize=10 ,也就是第几页,每页多大。

对应的查询语句为:

begin=(pageNo-1)*pageSize

select * from user limit 40,10

也就是我们要丢掉前面40条数据,然后从第40条开始查询10条出来

深翻页

如果翻页很深,例如第1000000(10万)页,那么就要丢掉前面100万数据,再取10条记录,这样就会导致效率低下

如何优化?

我们可以直接跳到底100万条数据,然后取10条,只需要给查询条件加上索引,例如id

select * from user where id>1000000 order by id limit 0,10

游标翻页

通过索引直接定位到读取的位置,效率基本是一样的。这个id>1000000就是我们的游标,这就是**游标翻页。**使用游标翻页可以完美的解决我们的深翻页问题

我们需要用一个变量cursor来快速定位到指定的记录,这个游标必须是走索引的,第一次查询的时候cursor为空,后面每次查询,cursor都取上一次查询的结果。

游标不适合跳页,只适合不停的往下翻的场景,例如往上查找聊天记录

如何判断查询到最后一页?

我们每次是固定x条,

  • 如果最后查出来的记录不等于x条,说明已经到了最后一页。
  • 如果总记录刚好是x的倍数,那么就要多查询一次(这一次查询结果为空)。

如何改进这种策略?

我们每次查询的时候,多查一条记录,然后游标cursor不设置为最后一个,而是倒数第二个,这样就方便判断是否查到最后了。