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

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. 覆盖索引:如果只需要查询少量的字段,我们可以直接在这些字段上建立一个联合索引,这样,在查询的时候,就可以直接从索引树上返回结果,就不需要进行回表操作了
相关推荐
禹凕2 小时前
MySQL ALTER 命令详解:灵活修改表结构的终极指南
数据库·mysql
想不明白的过度思考者2 小时前
Spring Boot 实战:MyBatis 操作数据库(上)
java·数据库·spring boot·mysql·mybatis
此生只爱蛋2 小时前
【MySQL】存储过程
数据库·mysql
青衫码上行16 小时前
高频 SQL 50题(基础版)| 查询 + 连接
数据库·sql·学习·mysql
禹凕19 小时前
MySQL——基础知识(正则表达式)
数据库·mysql·正则表达式
独泪了无痕21 小时前
Mac Homebrew 安装 MySQL 指南
数据库·mysql·mac
fchampion21 小时前
MYSQL自学笔记
数据库·笔记·mysql
XiaoHu020721 小时前
MySQL基础(第一弹)
数据库·c++·mysql