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

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. 覆盖索引:如果只需要查询少量的字段,我们可以直接在这些字段上建立一个联合索引,这样,在查询的时候,就可以直接从索引树上返回结果,就不需要进行回表操作了
相关推荐
for_ever_love__2 小时前
MySQL ORDER BY 排序优化:从 Using filesort 到索引有序扫描(含双路 / 单路排序原理)
java·mysql·优化·存储·by·order·filesort
Sayai6 小时前
DataX 离线数据同步实战:Elasticsearch 数据批量导出 MySQL(作业配置、并发调优与定时同步平台化设计)
大数据·mysql·elasticsearch·datax·数据同步
颜酱7 小时前
一栋商业大厦,讲清 InnoDB 的表空间、段、区和页
后端·mysql
PC2005-cloud9 小时前
Mysql学习笔记:InnoDB Cluster 集群从零搭建实战,基于 Docker 实现高可用读写分离架构
笔记·学习·mysql
这个DBA有点耶9 小时前
分布式事务深度:TCC空回滚、悬挂与Saga补偿风暴的根因与解法
数据库·mysql·代码规范
QEasycloud10 小时前
BOM接口抛转失败钉钉通知策略实战教程:MySQL异常日志到钉钉消息的端到端配置
android·mysql·钉钉
又尔D.10 小时前
MySQL下载安装
数据库·mysql
夜雪一千10 小时前
MySQL 删除 JSON 类型的数据实战
mysql·adb·json
iCxhust11 小时前
51单片机电力载波应用开发(九)51产品化
c语言·数据库·嵌入式硬件·mysql·51单片机·软件工程·c51
tryxr11 小时前
如何分析一个慢sql
数据库·sql·mysql·慢sql