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

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. 覆盖索引:如果只需要查询少量的字段,我们可以直接在这些字段上建立一个联合索引,这样,在查询的时候,就可以直接从索引树上返回结果,就不需要进行回表操作了
相关推荐
efir OONA1 小时前
MySQL数据库误删恢复_mysql 数据 误删
数据库·mysql·adb
陈陈CHENCHEN2 小时前
【数据库】MySQL 8.0.40 至 8.0.44 RPM 方式升级指南
数据库·mysql
Azhao11063 小时前
一文读懂分享网站模块介绍(附实操教程)
mysql
阿丰资源5 小时前
基于SpringBoot+MySQL的社区团购系统设计与实现(附源码+文档+数据库,直接运行)
数据库·spring boot·mysql
阿丰资源5 小时前
基于SpringBoot+MySQL的网上订餐系统(附源码)
spring boot·后端·mysql
代码不加糖5 小时前
0基础搭建前后端分离项目:实现菜单与界面左右布局
java·前端·javascript·mysql·elementui·mybatis
还是阿落呀5 小时前
第二章 数据类型、表的约束
数据库·mysql
WL_Aurora5 小时前
MySQL 插入中文报错 ERROR 1366 (HY000): Incorrect string value 的解决办法
数据库·mysql
Bert.Cai6 小时前
MySQL UPPER()函数详解
数据库·mysql
星轨zb6 小时前
为什么Mysql需要索引以及如何应用到项目中
数据库·mysql