• 游标查询的使用场景


    什么是游标查询呢?

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

    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 条并返回即可
     

  • 相关阅读:
    matlab保存示波器数据
    ES6及更新版本的新特性
    目标检测学习--yolo v4
    零代码实现问卷网与巨量引擎的对接
    三、webpack打包TS项目
    Kafka如何处理消费者之间的消息偏斜和负载均衡问题
    MyBatis中当实体类中的属性名和表中的字段名不一样,怎么办
    haoop启动正常,但上不去网页hadoop102:9870
    2022-09-20 第五组 张明敏 学习笔记
    三.STM32F030C8T6 MCU开发之UART配置例程
  • 原文地址:https://blog.csdn.net/weixin_59244784/article/details/133325660