【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面试题合集

相关新闻

最新新闻

C++模板元编程实现编译期量子电路模拟:零开销与极致性能

C++模板元编程实现编译期量子电路模拟:零开销与极致性能

1. 项目概述:当量子计算遇上编译期魔法最近在技术社区里,看到不少朋友还在用Python或者Java写运行时模拟的量子电路,每次调整一个量子比特的状态,都要重新跑一遍整个模拟流程,耗时又耗资源。这让我想起了C里一个老牌但…

2026/7/14 7:52:16
DLSS Swapper完全革命:智能游戏性能调优的终极解决方案

DLSS Swapper完全革命:智能游戏性能调优的终极解决方案

DLSS Swapper完全革命:智能游戏性能调优的终极解决方案 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper 你是否曾经因为游戏帧率波动而抓狂?当最新的DLSS版本在某些游戏中表现完美,却…

2026/7/14 7:52:16
VisTR:基于Transformer的视频实例分割算法解析与实践

VisTR:基于Transformer的视频实例分割算法解析与实践

1. VisTR算法概述:视频分割领域的Transformer革命视频实例分割(Video Instance Segmentation)作为计算机视觉领域的前沿方向,近年来因Transformer架构的引入迎来了突破性进展。VisTR(Video Instance Segmentation with…

2026/7/14 7:52:16
ADP5350 PMIC与STM32的嵌入式电源管理实战

ADP5350 PMIC与STM32的嵌入式电源管理实战

1. 项目背景与核心需求在嵌入式系统开发领域,电源管理始终是决定产品成败的关键因素。我曾参与一款工业级数据采集终端的研发,当系统需要同时处理锂电池充放电、多电压域转换、动态功耗调节等功能时,传统分立式电源方案暴露出明显缺陷——BOM…

2026/7/14 7:52:16
STM32F745VG与PAM8904构建低功耗智能警报系统

STM32F745VG与PAM8904构建低功耗智能警报系统

1. 项目背景与核心需求 在工业控制、智能家居和物联网设备中,可靠的通知系统是确保用户及时获取关键信息的基础设施。传统蜂鸣器方案存在功耗高、音质差、功能单一等问题,而基于STM32F745VG微控制器与PAM8904压电发声器驱动器的组合,能构建一…

2026/7/14 7:52:16
光伏发电GHI估算的无监督学习方法与实践

光伏发电GHI估算的无监督学习方法与实践

1. 光伏功率测量与全局水平辐照度估算的背景与挑战在光伏发电系统中,准确估算全局水平辐照度(GHI)是评估系统性能和预测发电量的关键环节。传统方法通常依赖地面气象站或卫星遥感数据,但这些方法存在成本高、空间分辨率有限等问题…

2026/7/14 7:47:16

月新闻