MySQL 分页越查越慢?Limit Offset 优化方案汇总
MySQL 分页越查越慢Limit Offset 优化方案汇总分页是开发中最常见的需求之一但大多数人在一开始都写过这样的代码SELECT * FROM orders ORDER BY id LIMIT 100000, 20;这条 SQL 在小数据量时没问题一旦偏移量变大性能就会急剧下降。原因很简单MySQL 需要跳过前面 100000 行才能读取后面的 20 行——这 100000 行全部被扫描并丢弃了。下面汇总 5 种经过验证的优化方案从简单到复杂覆盖不同场景。方案一子查询延迟关联最常用原理​ 先用覆盖索引快速定位起始 ID再关联回原表获取完整数据避免回表扫描大量无用行。-- 原始写法慢 SELECT * FROM orders ORDER BY id LIMIT 100000, 20; -- 优化后快 SELECT o.* FROM orders o INNER JOIN ( SELECT id FROM orders ORDER BY id LIMIT 100000, 20 ) AS tmp ON o.id tmp.id;适用场景​ 任何基于自增主键排序的分页偏移量较大时效果显著。性能提升​ 偏移 10 万行时通常能快10~50 倍。方案二游标分页推荐用于无限滚动原理​ 记住上一页最后一条记录的 ID下一页直接用WHERE id last_id代替LIMIT OFFSET。-- 第一页 SELECT * FROM orders ORDER BY id LIMIT 20; -- 第二页传入上一页最后一个 id 1000 SELECT * FROM orders WHERE id 1000 ORDER BY id LIMIT 20; -- 第三页传入上一页最后一个 id 1020 SELECT * FROM orders WHERE id 1020 ORDER BY id LIMIT 20;优点无论翻多少页速度恒定不需要计算偏移量缺点只能实现“下一页”不能跳转到任意页码依赖连续递增的主键如果有删除操作会有空洞但不影响功能适用场景​ 移动端列表、Feed 流、评论加载等“无限滚动”场景。方案三利用 BETWEEN 或 跳过偏移适合已知主键范围原理​ 如果知道当前页的起始主键值直接用范围查询代替 LIMIT OFFSET。-- 假设每页 20 条第 5001 页的起始 id 是 100000 SELECT * FROM orders WHERE id 100000 AND id 100020 ORDER BY id;优点​ 极快只需扫描目标范围内的数据。缺点需要前端传回起始 ID或后端计算好主键不能有跳跃太大的空洞否则页数不准适用场景​ 后台管理系统的固定页码列表配合缓存记录每页起始 ID。方案四禁用 COUNT(*)改为估算总数原理​ 很多分页组件需要显示总页数而COUNT(*)在大表上非常慢。如果业务允许近似值可以用SHOW TABLE STATUS或EXPLAIN估算。-- 精确但慢全表扫描 SELECT COUNT(*) FROM orders WHERE status 1; -- 估算行数毫秒级 SHOW TABLE STATUS LIKE orders; -- 或者 EXPLAIN SELECT * FROM orders WHERE status 1;注意​SHOW TABLE STATUS返回的是采样估算值误差可能在 30% 以内。EXPLAIN的rows字段也是估算值。适用场景​ 搜索列表、资讯列表等不需要精确总数的页面。方案五分区表 并行查询终极方案原理​ 将大表按时间或主键范围分区查询时只扫描相关分区甚至可以用多线程并行查询。-- 按月份分区 CREATE TABLE orders ( id BIGINT NOT NULL, created_at DATETIME NOT NULL, ... ) PARTITION BY RANGE (TO_DAYS(created_at)) ( PARTITION p202401 VALUES LESS THAN (TO_DAYS(2024-02-01)), PARTITION p202402 VALUES LESS THAN (TO_DAYS(2024-03-01)), PARTITION p202403 VALUES LESS THAN (TO_DAYS(2024-04-01)) ); -- 查询时自动只扫相关分区 SELECT * FROM orders WHERE created_at 2024-02-01 AND created_at 2024-03-01;适用场景​ 超大数据表千万级以上且有时间维度查询需求。方案对比速查表方案实现难度性能提升适用场景局限性子查询延迟关联⭐⭐高任意分页偏移量大时需要合适的索引游标分页⭐极高无限滚动、翻页按钮不能跳页BETWEEN 范围查询⭐极高固定页码、已知ID范围依赖主键连续性禁用 COUNT(*)⭐中等不需要精确总数失去精确分页信息分区表⭐⭐⭐⭐极高超大规模数据维护成本高实际选型建议场景一后台管理系统传统分页使用方案一子查询延迟关联如果数据量特别大百万级以上考虑方案四禁用 COUNT​ 或缓存总数场景二移动端/Web 无限滚动使用方案二游标分页配合last_seen_id参数传给前端场景三实时数据流如日志查询使用方案三BETWEEN 范围查询结合时间戳或自增 ID 做游标场景四超大规模数据千万级以上使用方案五分区表同时配合游标分页或子查询一句话总结别再用 LIMIT OFFSET 翻大页了。用游标代替偏移量用子查询延迟关联代替直接回表用估算代替精确 COUNT这三种技巧能解决 90% 的分页性能问题。

相关新闻

奇偶排序算法:从串行到并行的C++实现与优化

奇偶排序算法:从串行到并行的C++实现与优化

1. 项目概述:奇偶排序,一个被低估的并行排序思想在C/C的算法世界里,排序算法家族可谓星光熠熠,从经典的冒泡、选择、插入,到高效的快速、归并、堆排序,再到特定场景下的计数、桶排序。今天,我想…

2026/10/25 4:40:54 阅读更多 →
ANSYS Fluent多孔介质模型:催化转化器热流耦合仿真全流程解析

ANSYS Fluent多孔介质模型:催化转化器热流耦合仿真全流程解析

1. 从“堵”到“通”:多孔介质模型在工程仿真中的核心价值在流体仿真领域,我们常常会遇到一类特殊的“拦路虎”:那些内部结构极其复杂、无法或无需进行全细节建模的区域。比如,发动机的催化转化器、电子设备的散热风扇、化工反应器…

2026/10/24 13:40:37 阅读更多 →
安卓手机安装Kali Linux:Termux+Proot打造移动安全测试环境

安卓手机安装Kali Linux:Termux+Proot打造移动安全测试环境

1. 项目概述:为什么要在手机上运行Kali?几年前,当我第一次尝试在备用安卓手机上折腾Kali Linux时,身边不少朋友都觉得这想法有点“极客”过头了。一部手机,巴掌大的屏幕,能跑得动那个以强大闻名的渗透测试系…

2026/10/25 18:14:44 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/10/26 12:00:21 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/10/25 22:36:10 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/10/26 4:52:12 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/10/26 12:00:21 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/10/26 5:00:37 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/10/26 3:16:46 阅读更多 →

日新闻

周新闻

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/26 12:00:19 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/25 13:21:54 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/26 8:34:37 阅读更多 →