MySQL 深分页查询优化实践与经验分享

 更新时间:2025年12月16日 11:22:32   作者:kkkkkkkkl24  
文章总结了在企业级项目中优化深分页查询的经验,包括执行计划分析、索引优化和游标分页改写,通过复合索引和游标分页,可以显著提高查询性能,感兴趣的朋友跟随小编一起看看吧

在企业级项目中,深分页查询经常会成为性能瓶颈。本篇文章总结了我在实践中优化深分页 SQL 的经验,包括 执行计划分析、索引优化、游标分页改写 等内容。

一、问题场景

假设我们有一张订单表 orders,包含字段:

id, user_id, status, total_amount, create_time

原始查询为:

SELECT id, user_id, status, total_amount, create_time
FROM orders
WHERE user_id = 12345
ORDER BY create_time DESC
LIMIT 990, 10;
  • 业务背景:查询某用户最近的订单,且需要支持分页。
  • 数据量假设:企业级通常几十万到几百万条订单。

二、原始 SQL 执行计划分析

使用 EXPLAIN查看原始 SQL:

idselect_typetabletypepossible_keyskeykey_lenrowsExtra
1SIMPLEordersrefuser_iduser_id450Using filesort

分析:

  • type=ref → 使用了 user_id 索引进行精确匹配。
  • key=user_id → 索引选择正确。
  • Extra=Using filesort → ORDER BY create_time DESC 未覆盖索引,需要额外排序。
  • 扫描行数 → MySQL 会扫描前 990 条行再丢弃(LIMIT 偏移量大),深分页效率低。

✅ 结论:单列索引只能加速 WHERE 条件,排序仍需额外操作。

三、复合索引优化

为了提升查询效率,我们创建复合索引:

ALTER TABLE orders ADD INDEX idx_user_create (user_id, create_time DESC);
  • 作用
    • 覆盖 WHERE user_id=… 条件。
    • 覆盖 ORDER BY create_time DESC 条件。
  • 优化后 EXPLAIN
idselect_typetabletypepossible_keyskeykey_lenrowsExtra
1SIMPLEordersrefidx_user_createidx_user_create820Using index condition

分析:

  • type=ref → ref → 使用索引范围扫描,避免全表扫描。
  • key_len=8 → 复合索引长度增加。
  • Extra=Using index condition → ICP (Index Condition Pushdown) 优化回表行数。

✅ 结论:复合索引同时覆盖 WHERE + ORDER BY,大幅减少扫描行数和排序成本。

四、游标分页改写

深分页仍有偏移量大的问题,可以改写为游标分页:

SELECT id, user_id, status, total_amount, create_time
FROM orders
WHERE user_id = 12345 AND create_time < '2024-06-01 12:00:00'
ORDER BY create_time DESC
LIMIT 10;
  • 优势
    • 不用 OFFSET,避免扫描前面大量行。
    • 对大数据量分页性能稳定。
  • EXPLAIN 输出
idselect_typetabletypepossible_keyskeykey_lenrowsExtra
1SIMPLEordersrangeidx_user_createidx_user_create810Using index condition

✅ 结论:扫描行数恒定,排序在索引中完成,性能最佳。

五、实践总结

  • 深分页性能问题
    • OFFSET 大时,MySQL 会扫描并丢弃大量行。
    • ORDER BY 未覆盖索引 → filesort
  • 优化策略
  • 复合索引覆盖 WHERE + ORDER BY
  • 游标分页替代大 OFFSET 分页。
  • EXPLAIN 解析技巧
  • type → 尽量是 refrangeconst,避免 ALL
  • key / key_len → 关注索引是否被正确使用。
  • Extra → 理解 Using index conditionUsing filesort
  • 经验总结
    • 使用 ICP 能减少回表行数。
    • 游标分页适合大数据量分页查询。
    • SQL 优化不仅是索引,改写查询逻辑同样重要。

到此这篇关于MySQL 深分页查询优化实践与经验分享的文章就介绍到这了,更多相关mysql深分页查询内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySql允许远程连接如何实现该功能

    MySql允许远程连接如何实现该功能

    这篇文章主要介绍了 MySql允许远程连接如何实现该功能的相关资料,需要的朋友可以参考下
    2017-02-02
  • 根据status信息对MySQL服务器进行优化

    根据status信息对MySQL服务器进行优化

    网上有很多的文章教怎么配置MySQL服务器,但考虑到服务器硬件配置的不同,具体应用的差别,那些文章的做法只能作为初步设置参考,我们需要根据自己的情况进行配置优化,好的做法是MySQL服务器稳定运行了一段时间后运行,根据服务器的”状态”进行优化。
    2011-09-09
  • 详细讲述MySQL中的子查询操作

    详细讲述MySQL中的子查询操作

    这篇文章主要介绍了详细讲述MySQL中的子查询操作,文中也给出了具体的代码实例讲解,需要的朋友可以参考下
    2015-04-04
  • 深入了解mysql索引

    深入了解mysql索引

    这篇文章主要介绍了mysql索引的相关资料,文中讲解非常细致,帮助大家更好的理解和学习mysql,感兴趣的朋友可以了解下
    2020-07-07
  • MySQL skip-character-set-client-handshake导致的一个字符集问题

    MySQL skip-character-set-client-handshake导致的一个字符集问题

    这篇文章主要介绍了MySQL skip-character-set-client-handshake导致的一个字符集问题,需要的朋友可以参考下
    2014-07-07
  • MySQL优化之缓存优化(续)

    MySQL优化之缓存优化(续)

    本文是MySQL优化系列文章的第一篇缓存优化的续篇,为大家更为详细的介绍缓存优化的方方面面,希望大家能够喜欢
    2017-03-03
  • 详解mysql 获取某个时间段每一天、每一个小时的统计数据

    详解mysql 获取某个时间段每一天、每一个小时的统计数据

    这篇文章主要介绍了mysql 获取某个时间段每一天、每一个小时的统计数据,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • mysql 8.0.15 winx64解压版安装配置方法图文教程

    mysql 8.0.15 winx64解压版安装配置方法图文教程

    这篇文章主要为大家详细介绍了mysql 8.0.15 winx64解压版安装配置方法图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-02-02
  • MySQL日期函数与时间函数汇总(MySQL 5.X)

    MySQL日期函数与时间函数汇总(MySQL 5.X)

    这篇文章主要给大家介绍了关于MySQL 5.X日期函数与时间函数的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • mysql导出指定数据或部份数据的方法

    mysql导出指定数据或部份数据的方法

    mysql虽然可以使用mysqldump来进行数据的到处,可是在很多场合的需求都不一样,比如我只要导出某个字段呢?只要导出某些我需要的数据呢?
    2014-03-03

最新评论