news 2026/4/23 14:08:08

MySQL超大分页如何解决?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MySQL超大分页如何解决?

文章目录

  • 一、为什么 `LIMIT offset, size` 会慢到怀疑人生?
  • 二、解决思路总览(先看地图)
  • 三、王者方案:游标分页(Keyset Pagination)
      • 1️⃣ SQL 示例(最推荐)
      • 2️⃣ 前端交互方式
      • 3️⃣ 优点
      • 4️⃣ 缺点
    • 四、必须支持“跳页”?那就用覆盖索引
      • 1️⃣ 错误写法(慢)
      • 2️⃣ 正确写法(两步走)
      • 3️⃣ 进一步优化(覆盖索引)

一、为什么LIMIT offset, size会慢到怀疑人生?

SELECT*FROMordersORDERBYidLIMIT1000000,20;

MySQL 的真实工作流程不是“直接跳到第 100 万条”,而是:

  1. 从第一行开始扫描

  2. 丢掉前 1,000,000 行

  3. 再取 20 行

👉offset 越大,丢的数据越多
👉 即使有索引,也要一路扫过去

所以:
超大分页 = 扫描 + 丢弃 + 心态爆炸


二、解决思路总览(先看地图)

方案适合场景性能
游标分页(Keyset)列表 / 无限滚动⭐⭐⭐⭐⭐
子查询 + 覆盖索引必须跳页⭐⭐⭐⭐
记录最大页数后台系统⭐⭐⭐
ES / Redis搜索 / 复杂排序⭐⭐⭐⭐⭐

三、王者方案:游标分页(Keyset Pagination)

核心思想
👉 不要告诉数据库“我要第几页”
👉 告诉它“我要上一页最后一条之后的数据”

1️⃣ SQL 示例(最推荐)

SELECT*FROMordersWHEREid>1000000ORDERBYidLIMIT20;
  • id必须是递增、有索引

  • 前端传 lastId,而不是 page

2️⃣ 前端交互方式

  • 第一次:不传 lastId

  • 下一页:传上一次返回的lastId

{"lastId":1000000,"pageSize":20}

3️⃣ 优点

  • 🚀 性能稳定,和第几页无关

  • 🚫 不扫描无用数据

  • ✅ MySQL 最擅长这种查询

4️⃣ 缺点

  • ❌ 不能随意跳到第 100 页

  • ❌ 不适合“精确页码”的产品经理审美

📌结论

这是阿里、字节、美团后台列表的常规操作


四、必须支持“跳页”?那就用覆盖索引

如果产品经理坚持要“跳到第 500 页”,那只能降低伤害

1️⃣ 错误写法(慢)

SELECT*FROMordersORDERBYidLIMIT1000000,20;

2️⃣ 正确写法(两步走)

SELECT*FROMordersWHEREid>=(SELECTidFROMordersORDERBYidLIMIT1000000,1)ORDERBYidLIMIT20;

3️⃣ 进一步优化(覆盖索引)

SELECTo.*FROMorders oJOIN(SELECTidFROMordersORDERBYidLIMIT1000000,20)tONo.id=t.id;
  • 子查询只扫索引

  • 回表次数极少

📌注意
offset 再大也只是“相对能忍”,不是本质解决


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

Divinity Mod Manager:神界原罪2模组管理的终极解决方案

Divinity Mod Manager:神界原罪2模组管理的终极解决方案 【免费下载链接】DivinityModManager A mod manager for Divinity: Original Sin - Definitive Edition. 项目地址: https://gitcode.com/gh_mirrors/di/DivinityModManager 还在为神界原罪2的模组管理…

作者头像 李华
网站建设 2026/4/21 20:58:15

MySQL 如何定位分析慢查询?

文章目录1. 开启/检查慢日志2. 分析日志3. 用explain分析执行计划1. type ⭐⭐⭐(**最关键字段!**)2. rows ⭐3. key ⭐4.Extra ⭐⭐⭐(**隐藏陷阱!**)1. 开启/检查慢日志 看一下是否开启慢日志 SHOW VAR…

作者头像 李华
网站建设 2026/4/23 11:28:59

联想拯救者BIOS隐藏选项终极解锁指南:一键开启高级功能

联想拯救者BIOS隐藏选项终极解锁指南:一键开启高级功能 【免费下载链接】LEGION_Y7000Series_Insyde_Advanced_Settings_Tools 支持一键修改 Insyde BIOS 隐藏选项的小工具,例如关闭CFG LOCK、修改DVMT等等 项目地址: https://gitcode.com/gh_mirrors/…

作者头像 李华
网站建设 2026/4/23 10:36:20

Realtek 8852AE Wi-Fi 6驱动完整安装与优化配置终极指南

Realtek 8852AE Wi-Fi 6驱动完整安装与优化配置终极指南 【免费下载链接】rtw89 Driver for Realtek 8852AE, an 802.11ax device 项目地址: https://gitcode.com/gh_mirrors/rt/rtw89 还在为Linux系统下的Wi-Fi 6网卡驱动烦恼吗?🤔 这款专为Real…

作者头像 李华
网站建设 2026/4/16 13:25:53

Qwen3-8B-MLX:一键切换双模式,AI推理更智能高效

Qwen3-8B-MLX:一键切换双模式,AI推理更智能高效 【免费下载链接】Qwen3-8B-MLX-6bit 项目地址: https://ai.gitcode.com/hf_mirrors/Qwen/Qwen3-8B-MLX-6bit 导语:Qwen3-8B-MLX-6bit模型正式发布,通过创新的"思考模式…

作者头像 李华
网站建设 2026/4/19 3:24:01

mybatisplus乐观锁控制IndexTTS2并发任务冲突

MyBatis-Plus 乐观锁在 IndexTTS2 并发任务控制中的实践 在当前 AI 音频生成系统日益普及的背景下,语音合成(TTS)平台如 IndexTTS2 已广泛应用于虚拟主播、智能客服和有声内容生产等场景。随着用户量增长和功能扩展,原本为单机本地…

作者头像 李华