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

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 JSON 实战详解:从存储、查询、更新到 JSON_TABLE 与索引
sql·mysql
小满8782 天前
5.Mysql事务隔离级别与锁机制
mysql
元Y亨H3 天前
技术笔记:MySQL 字符集排序规则与大小写敏感性问题解决方案
mysql
这个DBA有点耶4 天前
GROUP BY优化全解:如何写出既不丢数据又飞快的分组查询
数据库·mysql·架构
掉头发的王富贵4 天前
【StarRocks】极限十分钟入门StarRocks
数据库·sql·mysql
SamDeepThinking4 天前
一条UPDATE语句在MySQL 8.0中到底加了几把锁?
后端·mysql·程序员
李白客6 天前
KES新版MySQL兼容能力再升级意味着什么?
mysql·国产数据库
Jim6008 天前
【吃透 MySQL InnoDB连载】第 1 章・解密线上数据库高频故障
mysql
GreatSQL8 天前
gt-checksum v4.0.0 新功能解读系列文章(4):SSL 加密连接——数据校验传输安全再升级
mysql