当前位置: 首页 > MySQL数据库

mysql分页查询如何优化

时间:2026-01-27 10:38:24

分页查询的优化方式:1、子查询优化,可通过把分页的SQL语句改写成子查询的方法获得性能上的提升。2、id限定优化,可以根据查询的页数和查询的记录数计算出查询的id的范围,然后根据“id between and”语句来查询。3、基于索引再排序进行优化,通过索引去找相关的数据地址,避免全表扫描。4、延迟关联优化,可以使用JOIN,先在索引列上完成分页操作,然后再回表获取所需要的列。

本教程操作环境:windows7系统、mysql8版本、Dell G3电脑。

分页查询的效率在数据量大的时候尤为重要,影响到前端响应和用户体验。

分页查询的优化方式

1、使用子查询优化

这种方式先定位偏移位置的 id,然后往后查询,这种方式适用于 id 递增的情况。

子查询优化原理:https://www.jianshu.com/p/0768ebc4e28d

select * from sbtest1 where k=504878 limit 100000,5;的查询过程:

首先会查询到索引叶子节点数据,然后根据叶子节点上的主键值去聚簇索引上查询需要的全部字段值。像下图左边这样,需要查询100005次索引节点,查询100005次聚簇索引的数据,最后再将结果过滤掉前100000条,取出最后5条。MySQL耗费了大量随机I/O在查询聚簇索引的数据上,而有100000次随机I/O查询到的数据是不会出现在结果集当中的。

既然一开始是利用索引的,为什么不先沿着索引叶子节点查询到最后需要的5个节点,然后再去聚簇索引中查询实际数据。这样只需要5次随机I/O,类似于上图右边的过程。这就是子查询优化,这种方式先定位偏移位置的id,然后往后查询,这种方式适用于id递增的情况。如下所示:

mysql>select*fromsbtest1wherek=5020952limit50,1;mysql>selectidfromsbtest1wherek=5020952limit50,1;mysql>select*fromsbtest1wherek=5020952andid>=(selectidfromsbtest1wherek=5020952limit50,1)limit10;mysql>select*fromsbtest1wherek=5020952limit50,10;

在子查询优化中,谓词中k是否有索引,对查询效率有很大影响,上述语句没有使用索引走全表扫描需要24.2s,走了索引后只需要0.67s。

mysql>explainselect*fromsbtest1wherek=5020952andid>=(selectidfromsbtest1wherek=5020952limit50,1)limit10;+----+-------------+---------+------------+-------------+---------------+------------+---------+-------+------+----------+------------------------------------------+|id|select_type|table|partitions|type|possible_keys|key|key_len|ref|rows|filtered|Extra|+----+-------------+---------+------------+-------------+---------------+------------+---------+-------+------+----------+------------------------------------------+|1|PRIMARY|sbtest1|NULL|index_merge|PRIMARY,c1|c1,PRIMARY|8,4|NULL|19|100.00|Usingintersect(c1,PRIMARY);Usingwhere||2|SUBQUERY|sbtest1|NULL|ref|c1|c1|4|const|88|100.00|Usingindex|+----+-------------+---------+------------+-------------+---------------+------------+---------+-------+------+----------+------------------------------------------+2rowsinset,1warning(0.11sec)

但是这种优化方法也有局限性:

  • 英特尔与 Vertiv 合作开发液冷 AI 处理器
  • 英特尔第五代 Xeon CPU 来了:详细信息和行业反应
  • 由于云计算放缓引发扩张担忧,甲骨文股价暴跌
  • Web开发状况报告详细介绍可组合架构的优点
  • 如何使用 PowerShell 的 Get-Date Cmdlet 创建时间戳
  • 美光在数据中心需求增长后给出了强有力的预测
  • 2027服务器市场价值将接近1960亿美元
  • 生成式人工智能的下一步是什么?
  • 分享在外部存储上安装Ubuntu的5种方法技巧
  • 全球数据中心发展的关键考虑因素
  • 英特尔与 Vertiv 合作开发液冷 AI 处理器

    英特尔第五代 Xeon CPU 来了:详细信息和行业反应

    由于云计算放缓引发扩张担忧,甲骨文股价暴跌

    Web开发状况报告详细介绍可组合架构的优点

    如何使用 PowerShell 的 Get-Date Cmdlet 创建时间戳

    美光在数据中心需求增长后给出了强有力的预测

    2027服务器市场价值将接近1960亿美元

    生成式人工智能的下一步是什么?

    分享在外部存储上安装Ubuntu的5种方法技巧

    全球数据中心发展的关键考虑因素