如何优化深度分页的性能问题

mysql 复制代码
select * from t order by id limit offset,size

为什么深度分页的效率很慢?因为对于深度分页的offset,MySQL必须一条一条数据读取,直到读取够offset条数据,然后从第offset+1条数据开始,取size条数据并返回 解决方法:

  1. 游标记录 :每次分页查询之后,记录当前页的最后一条数据的id,查询下一页时将id带上,直接用where id>上一页最大值查询即可,但是这个方法不支持跳页,必须一页一页往下查询,如果有跳页的情况,就无法知道上一页的最大值为多少
  2. 子查询:对于下列查询语句
mysql 复制代码
select * from t order by id limit 10000000,10;

由于上述语句使用的是select * ,因此在查询的时候除了根据主键id查询到对应的数据,还需要进行回表操作,也就是需要进行千万次回表操作,所以可以对上述查询语句进行修改

mysql 复制代码
select * from t where id >= (
	select id from t order by id limit 10000000,1
) order by id limit 10;

对于这条查询语句,会优先执行子查询,也就是在B+树上查询10000000+1条数据,并获取最后一条数据的主键id,然后在外面的查询中,直接通过where条件,获取大于等于子查询中最后一条数据主键id的数据,然后从这条数据开始往后查询10条数据

这个sql与第一个sql最大的区别就是,不再需要进行千万次的回表操作,分页查询里面的每一次查询都只在聚簇索引上进行,提高了性能

  1. 覆盖索引:如果只需要查询少量的字段,我们可以直接在这些字段上建立一个联合索引,这样,在查询的时候,就可以直接从索引树上返回结果,就不需要进行回表操作了
相关推荐
Chris _data12 分钟前
从宿主机(Windows)通过 NAT 模式连接虚拟机(Ubuntu)中的 MySQL
windows·mysql·ubuntu
巧妹儿16 分钟前
AI Agent 实战:MySQL 监控指标查询 Skill|华为云 + 腾讯云双兼容可直接复用
python·mysql·ai·大模型·华为云·腾讯云
Wait....33 分钟前
MySQL事务知识复习
数据库·mysql
我真会写代码1 小时前
MySQL高频面试题(含详细解析):从基础到高级,备战面试不踩坑
数据库·mysql·面试
qq_283720051 小时前
MySQL 8.0新特性高频面试题 30 道(超详细答案)
数据库·mysql·面试·mysql8·高频试题
源码站~2 小时前
基于Spring Boot+Vue3的烹饪交流学习系统 设计与实现
java·vue.js·spring boot·后端·mysql·毕业设计·毕设
014-code2 小时前
MySQL 很实用的 SQL 语句清单(排障与日常运维)
sql·mysql
Yiyi_Coding2 小时前
Oracle 、 Mysql、Guass 的 sequence
数据库·mysql·oracle
别抢我的锅包肉12 小时前
【MySQL】第四节 - 多表查询、多表关系全解析
数据库·mysql·datagrip
zzh08113 小时前
MySQL高可用集群笔记
数据库·笔记·mysql