游标翻页问题-索引优化
About 2 min
游标翻页问题
普通的翻页就是前端会有一个分页条,可以指定一页的条数以及可以任意查看第几页
对应的参数是pageNo=5
和pageSize=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
不设置为最后一个,而是倒数第二个,这样就方便判断是否查到最后了。