news 2026/5/3 2:14:40

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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 优化不仅是索引,改写查询逻辑同样重要。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/30 9:15:59

第五十七篇-ComfyUI+V100+安装

环境 系统&#xff1a;CentOS-7 CPU : E5-2680V4 14核28线程 内存&#xff1a;DDR4 2133 32G * 2 显卡&#xff1a;Tesla V100-32G【PG503】 (水冷) 驱动: 535 CUDA: 12.2下载 git clone https://github.com/comfyanonymous/ComfyUI cd ComfyUI可以切换版本 # 查看远程分支 g…

作者头像 李华
网站建设 2026/5/2 3:45:55

字节,字,半字

在计算机体系结构和嵌入式开发&#xff08;如 ESP32、ARM、x86 等&#xff09;中&#xff0c;“字”“半字”“字节”的大小不是固定值&#xff0c;而是依赖于具体处理器架构。以下是通用定义及常见平台对照&#xff1a;✅ 标准定义&#xff08;基于处理器字长&#xff09;术语…

作者头像 李华
网站建设 2026/5/1 23:38:07

软件工程导论实验报告——商品管理系统(黑龙江大学)

面向对象分析与设计实验一 软件需求分析1.1 业务需求描述该系统在商家和顾客之间搭建了一个桥梁&#xff0c;需要实现商家对商品的售卖和修改&#xff0c;以及顾客的购买商品需求&#xff0c;期间还需要实现对商品和商家的管理以及对顾客的评估和管理。系统本身还需要对商家和顾…

作者头像 李华
网站建设 2026/5/2 7:05:59

不能头脑简单地搞“凡是”:凡是偶数2n(n的变域是N)必∈N

不能头脑简单地搞“凡是”&#xff1a;凡是偶数2n&#xff08;n的变域是N&#xff09;必∈N黄小宁设一游击队有无穷多个队员&#xff0c;队中各人都配有一枪。各枪都有枪号&#xff0c;将配有 n 号枪的人记为 n 号人&#xff0c;队中枪与人已一一配对&#xff1a; n 号人↔n 号…

作者头像 李华
网站建设 2026/4/27 8:28:04

Parquet Reading 加速

参考链接 https://zhuanlan.zhihu.com/p/675905983

作者头像 李华