• 游标查询的使用场景


    什么是游标查询呢?

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

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

  • 相关阅读:
    【面试题】面试小技巧:如果有人问你 xxx 技术是什么?
    SpringMVC学习笔记二(获取Cookies、Session和Header、IDEA热部署)
    JS操作字符串方法学习系列(1)-每天学习10个方法
    Spring常见的注解
    STM32点阵静态显示汉字
    【MySQL Router】使用 systemd 管理 MySQL Router
    Pytorch数据集读出到transform全过程
    Oracle-12c如何从ASM备份里面恢复OCR
    C#以太网简介
    LeetCode 69.x的平方根
  • 原文地址:https://blog.csdn.net/weixin_59244784/article/details/133325660