我的理解是为上一次查询打一个标记,下一次查询从这个标记往下检索;我觉得可以放在这样一个场景说,大家更容易理解,比如有一个分页,我们正常的写法如;
select * from student limit 100,10;
上边的写法肯定是没有问题的,我们首先来理解一下它的含义,意思是我们回表查询110次,把前100条剔除掉,只取出后边10条,那这样一来我们是不是就会想到一个问题,如果深度分页呢,比如,limit 1000000,100 这样一来意思是我们要回表1000100次,把前边的数据剔除掉,那对我们来说前边的1000000次其实是没有意义的,这样的话就造成了很多不必要的性能损耗,那如何优化深度查询的问题的呢?就有了今天的主角----游标查询
首先游标查询有几个特点:有序,唯一,无法跳页,游标位置
综合上边的特点,我认为唯一适合的场景就是滚轮翻页,且翻页的数据有字段唯一并且有序,唯一是为了记录每一次翻页最后一条记录,有序是为了实现游标的方向
首先该表如果有一个字段唯一并且有序的话,那么就可以使用游标优化深度分页
举例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 条并返回即可