【Java踩坑笔记】43_LIMIT大偏移量慢查询,你的分页写法过时了 43 | LIMIT 大偏移量慢查询你的分页写法过时了摘要LIMIT 100000, 10要先读 100000 行再丢弃即使有索引也很慢。延迟关联WHERE id lastId是更好的分页方案。一、问题现象-- ❌ 慢查询偏移量 100000SELECT*FROMordersORDERBYidLIMIT100000,10;-- 执行时间约 500ms100万行数据原因MySQL 必须读取前 100000 行然后丢弃只返回最后 10 行。二、踩坑现场场景前端分页用户跳到最后一页// ❌ 前端传 pageNum10000后端直接 LIMITpublicListOrdergetOrders(intpageNum,intpageSize){intoffset(pageNum-1)*pageSize;returnorderMapper.selectByPage(offset,pageSize);// SQL: LIMIT #{offset}, #{pageSize}}现象pageNum 越大查询越慢。三、原理解析3.1 LIMIT 偏移量的执行过程LIMIT 100000, 10 的执行 1. 按 ORDER BY 字段排序或用索引 2. 读取前 100000 行不返回给客户端 3. 读取接下来 10 行 4. 返回这 10 行问题步骤 2 即使有索引也要遍历100000 行。3.2 为什么索引帮不了偏移量索引可以加速WHERE过滤但LIMIT 100000, 10是跳过前 100000 行索引无法避免这个跳过动作。四、正确写法4.1 延迟关联推荐兼容深分页-- ✅ 先通过索引拿 ID再关联拿数据SELECTo.*FROMorders oINNERJOIN(SELECTidFROMordersORDERBYidLIMIT100000,10)AStmpONo.idtmp.id;原理子查询只读取id字段覆盖索引比SELECT *快很多。4.2 记住上一页最后一条的 ID最优但不支持跳页-- ✅ WHERE id lastId走主键索引O(1)SELECT*FROMordersWHEREid100000ORDERBYidLIMIT10;// ✅ 前端/App 翻页用这个方案publicListOrdergetNextPage(LonglastId,intpageSize){returnorderMapper.selectByIdGreaterThan(lastId,pageSize);}4.3 MyBatis 实现延迟关联!-- ✅ MyBatis 实现延迟关联 --selectidselectByPageOptimizedresultTypeOrderSELECT o.* FROM orders o INNER JOIN ( SELECT id FROM orders WHERE create_time #{startTime} ORDER BY id LIMIT #{offset}, #{pageSize} ) tmp ON o.id tmp.id/select五、最佳实践✅ 分页查询的 4 条规范不支持深分页产品层面限制最大 pageNum如最多 100 页能用WHERE id lastId就用它最快必须用偏移量时用延迟关联优化ORDER BY的字段必须有索引 EXPLAIN 验证EXPLAINSELECT*FROMordersORDERBYidLIMIT100000,10;-- 看 rows 列如果是 100010说明扫描了 10万行六、小结LIMIT 100000, 10要先读 10万行再丢弃即使有索引也慢最优方案WHERE id lastId LIMIT 10走主键索引兼容跳页用延迟关联INNER JOIN子查询只查 ID产品层面限制最大分页深度从根源解决问题下一篇预告数据库字段用保留字MyBatis 生成的 SQL 直接报错—— 用反引号包裹字段名但这个坑不止这一个。更多资料一线大厂Java面试题合集

相关新闻

最新新闻

SerenityOS 命令行选项解析指南:getopt 与 getopt_long 用法、返回值与底层实现

SerenityOS 命令行选项解析指南:getopt 与 getopt_long 用法、返回值与底层实现

SerenityOS 命令行选项解析指南:getopt 与 getopt_long 用法、返回值与底层实现 【免费下载链接】serenity The Serenity Operating System 🐞 项目地址: https://gitcode.com/GitHub_Trending/se/serenity 导读 本文以 getopt(3) 手册 为核心&a…

2026/10/1 19:32:24
轻量服务器还是ECS?大促云服务器选购与避坑实战指南

轻量服务器还是ECS?大促云服务器选购与避坑实战指南

每年大促节点,群里永远有人在问同一个问题:“38元的轻量服务器到底怎么抢?为什么我每次点进去都是已售罄?68元直购和99元的ECS我到底选哪个?”作为一个常年帮团队和自己采购云服务器的老用户,我太清楚这种纠…

2026/9/30 21:32:07
为 AI 代理的 Review 动作编写 Cedar 审批门控策略:review-agent-governance 策略编写实战指南

为 AI 代理的 Review 动作编写 Cedar 审批门控策略:review-agent-governance 策略编写实战指南

为 AI 代理的 Review 动作编写 Cedar 审批门控策略:review-agent-governance 策略编写实战指南 【免费下载链接】agents Multi-harness agentic plugin marketplace for Claude Code, Codex, Cursor, OpenCode, GitHub Copilot, and Google Antigravity 项目地址:…

2026/9/30 19:41:56
PaddleOCR 手写数学公式识别算法 CAN 实战指南:Counting-Aware Network 训练、评估与推理部署

PaddleOCR 手写数学公式识别算法 CAN 实战指南:Counting-Aware Network 训练、评估与推理部署

PaddleOCR 手写数学公式识别算法 CAN 实战指南:Counting-Aware Network 训练、评估与推理部署 【免费下载链接】PaddleOCR Turn any PDF or image document into structured data for your AI. A powerful, lightweight OCR toolkit that bridges the gap between i…

2026/10/1 19:32:23
Spring源码解析:构造器注入的类型转换与候选匹配机制

Spring源码解析:构造器注入的类型转换与候选匹配机制

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 19:32:35
openai-agents-python 多模型接入指南:深入解析 AnyLLMModel 适配层与 any-llm 路由

openai-agents-python 多模型接入指南:深入解析 AnyLLMModel 适配层与 any-llm 路由

openai-agents-python 多模型接入指南:深入解析 AnyLLMModel 适配层与 any-llm 路由 【免费下载链接】openai-agents-python A lightweight, powerful framework for multi-agent workflows 项目地址: https://gitcode.com/GitHub_Trending/op/openai-agents-pyth…

2026/9/30 21:32:11

日新闻

周新闻

月新闻