游标查询的使用场景

什么是游标查询呢?

我的理解是为上一次查询打一个标记,下一次查询从这个标记往下检索;我觉得可以放在这样一个场景说,大家更容易理解,比如有一个分页,我们正常的写法如;

select *  from student limit 100,10;

上边的写法肯定是没有问题的,我们首先来理解一下它的含义,意思是我们回表查询110次,把前100条剔除掉,只取出后边10条,那这样一来我们是不是就会想到一个问题,如果深度分页呢,比如,limit 1000000,100     这样一来意思是我们要回表1000100次,把前边的数据剔除掉,那对我们来说前边的1000000次其实是没有意义的,这样的话就造成了很多不必要的性能损耗,那如何优化深度查询的问题的呢?就有了今天的主角----游标查询

使用场景?

首先游标查询有几个特点:有序,唯一,无法跳页,游标位置

综合上边的特点,我认为唯一适合的场景就是滚轮翻页,且翻页的数据有字段唯一并且有序,唯一是为了记录每一次翻页最后一条记录,有序是为了实现游标的方向

如何使用?

首先该表如果有一个字段唯一并且有序的话,那么就可以使用游标优化深度分页

  1. 首先我们需要定义一个查询条数,就是每次查询多少条
  2. 参数的话就是一个上次的查询位置
  3. 如果上一次的查询位置为null,那么意味着我们当前查询是第一次,按照当前字段先排序,limit 我们查询的条数即可,返回参数就是,查询出来的数据,最后一条数据的标识,是否是最后一页,是最后一页,前端下一次就不用调用接口了,不是的话,就继续调用,每次调用下一次把上一次返回的最后一条数据标识返回去
  4. 如果不是最后一次,那么我们就需要在3的基础上加一个游标的方向

举例sql如下,我这里使用的是自增id,所以直接使用id作为游标查询条件

SELECT * FROM student WHERE id > 1000000 order by id LIMIT 1000;

此时,MySQL 需要找到的不再是第 1000001 条记录,而是 id 大于 1000000 的第 1 条记录。因为 B+ 树的非叶子节点都包含数据索引,所以我们只需要从根节点开始向下走到叶子节点,即可找到 id 大于 1000000 的第 1 条记录,然后从该条记录开始向后继续遍历 B+ 树的叶子节点,直至取出 1000 条并返回即可
 

猜你喜欢

转载自blog.csdn.net/weixin_59244784/article/details/133325660