MySQL快速分页查询的优化方案

 更新时间:2026年03月01日 14:42:48   作者:hellotutu  
本文主要介绍了传统分页方法的性能瓶颈,并详细阐述了五种优化方案:基于游标的分页、覆盖索引优化、子查询优化、延迟关联和预计算分页数据,通过性能对比,展示了不同方法在不同场景下的适用性,并指出了使用这些优化方案时需要注意的事项,需要的朋友可以参考下

‌一、传统分页的问题

LIMIT OFFSET性能瓶颈‌
当查询SELECT * FROM table LIMIT N OFFSET M时,MySQL需要扫描前M+N行数据,丢弃前M行,导致偏移量越大性能越差,尤其在百万级数据场景下延迟显著

‌二、优化方案‌

‌ 1. 基于游标的分页(Cursor-based Pagination)‌

  • ‌原理‌
    记录上一页最后一条记录的标识(如主键),下次查询直接定位到该位置,避免全表扫描¹²⁴⁶⁷⁸。
  • ‌适用场景‌
    按唯一且有序的字段(如自增ID、时间戳)排序的分页。
  • ‌示例
-- 第一页
SELECT * FROM table ORDER BY id DESC LIMIT 10;

-- 第二页(假设上一页最后一条id=100)
SELECT * FROM table WHERE id < 100 ORDER BY id DESC LIMIT 10;

2. 覆盖索引优化(Covering Index)‌

  • ‌原理‌
    仅通过索引即可完成查询,无需回表读取数据行,减少I/O开销。
  • 示例
-- 普通分页(慢)
SELECT * FROM table ORDER BY id LIMIT 100000, 10;

-- 覆盖索引优化(快)
SELECT * FROM table 
INNER JOIN (SELECT id FROM table ORDER BY id LIMIT 100000, 10) AS tmp 
USING (id);

‌3. 子查询优化‌

  • ‌原理‌
    先通过子查询获取分页主键,再用主键关联原表,减少数据扫描量¹²⁴⁶⁷⁸。
  • 示例
SELECT * FROM table 
WHERE id >= (SELECT id FROM table ORDER BY id LIMIT 100000, 1)
ORDER BY id LIMIT 10;

4. 延迟关联(Deferred Join)‌

  • ‌原理‌
    先通过索引获取主键,再关联主表查询完整数据,减少大偏移量的资源消耗²⁴⁶⁷⁸。
  • ‌示例‌
SELECT * FROM table 
INNER JOIN (SELECT id FROM table ORDER BY id LIMIT 100000, 10) AS tmp 
ON table.id = tmp.id;

5. 预计算分页数据‌

  • 原理‌
    使用缓存(如Redis)存储热点页数据,或定期生成静态分页结果²⁶⁷⁹。
  • ‌适用场景‌
    数据更新频率低的场景,如历史记录、归档数据。

三、性能对比‌

方法百万数据耗时(示例)百万数据耗时(示例)
LIMIT OFFSET2.5s小偏移量(OFFSET < 1000)
游标分页‌ 0.01s按有序字段分页)
‌覆盖索引优化0.1s仅需索引列的分页
‌子查询优化0.2s大偏移量分页)

四、注意事项‌

1‌、索引设计‌

  • 排序字段必须建立索引(单字段或复合索引)。
  • 避免ORDER BY与WHERE条件索引冲突导致全表扫描。

2、数据一致性‌

  • 游标分页需确保排序字段唯一,否则可能出现重复或遗漏。
  • 高并发写入场景下,分页结果可能因数据变动出现偏差,需权衡实时性。

3、业务适配‌

  • 游标分页不支持跳页,需前端记录游标位置。
  • 若需多字段排序,需建立复合索引并测试性能。

五、总结‌

  • ‌小数据量场景‌:直接使用LIMIT OFFSET,简单易用。
  • 大数据量场景‌:
    1. 优先选择‌游标分页‌,性能最优。
    2. 若需兼容跳页,使用‌子查询优化‌或‌延迟关联‌。
    3. 结合业务设计缓存策略,减少实时查询压力。

以上就是‌MySQL快速分页查询的优化方案的详细内容,更多关于‌MySQL快速分页查询优化的资料请关注脚本之家其它相关文章!

相关文章

  • mysql跨数据库复制表(在同一IP地址中)示例

    mysql跨数据库复制表(在同一IP地址中)示例

    这篇文章主要介绍了mysql跨数据库复制表(在同一IP地址中)示例,需要的朋友可以参考下
    2014-03-03
  • MySQL使用LIKE索引是否失效的验证的示例

    MySQL使用LIKE索引是否失效的验证的示例

    LIKE查询可以通过一些方法来使得LIKE查询能够使用索引,本文主要介绍了MySQL使用LIKE索引是否失效的验证的示例,具有一定的参考价值,感兴趣的可以了解一下
    2024-08-08
  • mysql索引必须了解的几个重要问题

    mysql索引必须了解的几个重要问题

    这篇文章主要介绍了mysql索引必须了解的几个重要问题,分析了MySQL数据库索引的相关概念与使用技巧,需要的朋友可以参考下
    2016-04-04
  • MySQL清空数据表的方法实例与分析

    MySQL清空数据表的方法实例与分析

    这篇文章给大家详细介绍了MySQL清空数据表的方法,文中给出了实例代码,对大家学习使用MySQL具有一定的参考借鉴价值,有需要的可以参考借鉴,下面来一起看看吧。
    2016-10-10
  • 通过sysbench工具实现MySQL数据库的性能测试的方法

    通过sysbench工具实现MySQL数据库的性能测试的方法

    sysbench是一款压力测试工具,可以测试系统的硬件性能,也可以用来对数据库进行基准测试。这篇文章主要介绍了通过sysbench工具实现MySQL数据库的性能测试 ,需要的朋友可以参考下
    2019-07-07
  • linux版mysql8配置表名不区分大小写问题

    linux版mysql8配置表名不区分大小写问题

    文章介绍了MySQL 8的安装步骤,包括配置忽略大小写、备份数据、停止和删除数据库文件、配置my.cnf文件、初始化、启动服务和登录设置密码,还讨论了在配置远程连接时遇到的常见问题,特别是MySQL 8版本中由于密码加密方法变化导致的问题解决方法
    2024-11-11
  • MySQL 可扩展设计的基本原则

    MySQL 可扩展设计的基本原则

    可扩展设计是一个非常复杂的系统工程,所涉及的各个方面非常的广泛,技术也较为复杂,可能还会带来很多其他方面的问题。但不管我们如何设计,不管遇到哪些问题,有些原则我们还是必须确保的。
    2021-05-05
  • 如何优化sql中的orderBy语句

    如何优化sql中的orderBy语句

    这篇文章主要介绍了如何优化sql中的orderBy语句,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09
  • Linux下如何通过MySQL二进制包安装MySQL5.7

    Linux下如何通过MySQL二进制包安装MySQL5.7

    这篇文章主要介绍了Linux下如何通过MySQL二进制包安装MySQL5.7,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07
  • mysql中left join设置条件在on与where时的用法区别分析

    mysql中left join设置条件在on与where时的用法区别分析

    这篇文章主要介绍了mysql中left join设置条件在on与where时的用法区别,结合实例形式分析了mysql中left join设置条件在on与where时的相关用法区别与操作注意事项,需要的朋友可以参考下
    2020-02-02

最新评论