当前位置: 首页 > news >正文

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

在企业级项目中,深分页查询经常会成为性能瓶颈。本篇文章总结了我在实践中优化深分页 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

分析:

  1. type=ref→ 使用了user_id索引进行精确匹配。

  2. key=user_id→ 索引选择正确。

  3. Extra=Using filesort→ ORDER BY create_time DESC 未覆盖索引,需要额外排序。

  4. 扫描行数→ MySQL 会扫描前 990 条行再丢弃(LIMIT 偏移量大),深分页效率低。

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


三、复合索引优化

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

ALTER TABLE orders ADD INDEX idx_user_create (user_id, create_time DESC);
  • 作用

    1. 覆盖WHERE user_id=…条件。

    2. 覆盖ORDER BY create_time DESC条件。

  • 优化后 EXPLAIN

idselect_typetabletypepossible_keyskeykey_lenrowsExtra
1SIMPLEordersrefidx_user_createidx_user_create820Using index condition

分析:

  1. type=ref → ref→ 使用索引范围扫描,避免全表扫描。

  2. key_len=8→ 复合索引长度增加。

  3. 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

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


五、实践总结

  1. 深分页性能问题

    • OFFSET 大时,MySQL 会扫描并丢弃大量行。

    • ORDER BY 未覆盖索引 →filesort

  2. 优化策略

    • 复合索引覆盖 WHERE + ORDER BY

    • 游标分页替代大 OFFSET 分页。

  3. EXPLAIN 解析技巧

    • type→ 尽量是refrangeconst,避免ALL

    • key / key_len→ 关注索引是否被正确使用。

    • Extra→ 理解Using index conditionUsing filesort

  4. 经验总结

    • 使用 ICP 能减少回表行数。

    • 游标分页适合大数据量分页查询。

    • SQL 优化不仅是索引,改写查询逻辑同样重要。

http://www.cnnetsun.cn/news/27082.html

相关文章:

  • 227827827
  • MCU的启动流程你了解么?
  • 逻辑回归(Logistic Regression)进行多分类的实战
  • RNN(循环神经网络)原理
  • 人机协同重构创作生态——生成式AI赋能内容产业的变革与思考
  • Java 小白求职者在互联网大厂的面试实录:从 Spring Boot 到微服务架构
  • V助手舆情分析智能体:重塑舆情分析,从“人找信息”到“信息为人”
  • 连接2026:十款远程控制软件真实力横评与选择指南
  • 计算机毕业设计springboot基于Spark++Vue.js的学生管理系统 Spark+Vue 高校学生综合信息管理平台 基于 SpringBoot+Spark+Vue 的全链路学生事务中心
  • JavaScript 集合操作的哈希碰撞:攻击者如何利用特殊 Key 导致 Map/Set 性能降级到 O(N)
  • 为什么 C盘空间会莫名其妙减少(即使没装新软件)?
  • 17、深入理解 Linux 文件系统机制与结构
  • 29、Linux 软件使用与故障排除指南
  • 从入门到转行:网络安全自学与跳槽的终极建议
  • 网络安全小白自学之路,别拜师了,求人不如求己_网络安全小白怎么自学
  • 从系统运维到网络安全工程师,8个月转行真实经验分享!
  • 算法系列(Algorithm)- 快速排序
  • RobotStudio2025全功能授权
  • IsaacLab中UR机械臂与Robotiq夹爪的5大配置难点与解决方案
  • cmark Markdown解析器终极指南:从入门到精通
  • 4-bit量化FLUX模型:让专业AI绘图走进寻常百姓家
  • Excel VBA快速入门:7天从零到精通终极指南
  • AutoHotkey鼠标轨迹自动化终极指南:从零开始实现精准操作回放
  • UxPlay 终极指南:在 Linux 系统上实现 AirPlay 镜像的完整教程
  • 1-2 惜败!国安亚冠连败 中超 16 强魔咒难破
  • 一键解锁阅读3.0书源终极合集:1629个精品资源任你选
  • 一般人不懂Windows
  • Java 基于多线程机制的专项实验
  • 51、Linux 系统中 shell 环境管理与脚本编写全解析
  • 53、编写高效 Shell 脚本:从基础到实践