mysql limit偏移量大怎么优化_mysql分页性能提升技巧

发布时间 - 2026-02-01 00:00:00    点击率:
LIMIT 100000,20 慢因需扫描跳过前10万行;应改用游标分页(如WHERE id

为什么 LIMIT 100000, 20 会慢得离谱

因为 MySQL 在执行这类语句时,必须先扫描并跳过前 100000 行(即使不返回),再取后续 20 行。如果没走覆盖索引,还会回表查完整记录;若 ORDER BY 字段无索引,甚至要额外排序临时结果集。本质是“全扫+丢弃”,不是“直接定位”。

用游标分页替代 LIMIT offset, size

核心思路:不依赖行号偏移,改用上一页最后一条记录的排序字段值作为查询起点。要求排序字段(如 idcreated_at)有唯一性或配合其他字段构成唯一约束。

示例(按自增 id 降序分页):

SELECT * FROM orders WHERE id < 123456 ORDER BY id DESC LIMIT 20;

下一页就用刚查出的最小 id 值继续缩小范围。这种方式避免了跳过大量数据,索引可高效定位起点。

  • 必须有合适的索引支持,例如 INDEX (id)INDEX (status, created_at, id)
  • 不能跳页(比如直接跳到第 100 页),只适合“下一页/上一页”场景
  • 若排序字段非唯一(如多个记录 created_at 相同),需补上主键去重:WHERE (created_at, id)

延迟关联(deferred join)减少回表开销

当分页字段和查询字段不在同一索引中时,LIMIT 后仍需回表取数据,大偏移量下回表次数爆炸。延迟关联先把主键捞出来,再用主键二次查详情,让回表次数固定为 LIMIT size 次,而非 offset + size 次。

示例:

SELECT t1.* FROM orders t1
INNER JOIN (
    SELECT id FROM orders WHERE status = 1 ORDER BY created_at DESC LIMIT 100000, 20
) t2 ON t1.id = t2.id;

内层子查询只走索引(假设 INDEX(status, created_at, id)),外层用主键精准回查。

  • 需要复合索引覆盖 WHERE 条件、ORDER BY 和主键(否则子查询仍可能慢)
  • SELECT * 场景效果明显;若只需几个字段,优先建覆盖索引更简单
  • MySQL 5.6+ 对这种写法优化较好,老版本注意检查执行计划是否走了 Using index

物理分表 or 时间分区缓解单表压力

当单表超千万级且分页请求集中在最新数据时,老数据拖慢整体查询。这时靠 SQL 优化已触及瓶颈,得从结构入手。

  • 按月/季度分表(如 orders_202501),查询时明确指定表名,避开历史数据扫描
  • PARTITION BY RANGE (TO_DAYS(created_at)) 分区,配合 WHERE created_at >= '2025-01-01' 可自动裁剪分区
  • 注意:分

    表后 COUNT(*) 和跨时间范围的分页会变复杂,需应用层聚合

真正的大偏移量问题,往往不是 SQL 写得不够巧,而是数据模型没跟上访问模式——游标分页解决“怎么查快”,而分表/分区决定“查哪些”。


# mysql  # 为什么  # red  # sql  # count  # select  # using  # 分页  # 主键  # 跳过  # 下一页  # 上一页  # 行号  # 几个  # 偏移量  # 走了  # 多个 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: JavaScript数据类型有哪些_如何准确判断一个变量的类型  如何在服务器上配置二级域名建站?  如何在新浪SAE免费搭建个人博客?  无锡营销型网站制作公司,无锡网选车牌流程?  如何在云虚拟主机上快速搭建个人网站?  jimdo怎样用html5做选项卡_jimdo选项卡html5实现与切换效果【指南】  Laravel Admin后台管理框架推荐_Laravel快速开发后台工具  JS弹性运动实现方法分析  zabbix利用python脚本发送报警邮件的方法  Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】  简单实现Android验证码  C++用Dijkstra(迪杰斯特拉)算法求最短路径  谷歌Google入口永久地址_Google搜索引擎官网首页永久入口  什么是javascript作用域_全局和局部作用域有什么区别?  如何在IIS7中新建站点?详细步骤解析  如何在腾讯云服务器快速搭建个人网站?  浅谈Javascript中的Label语句  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  JavaScript如何实现类型判断_typeof和instanceof有什么区别  网站建设保证美观性,需要考虑的几点问题!  Laravel怎么使用Blade模板引擎_Laravel模板继承与Component组件复用【手册】  Laravel如何处理和验证JSON类型的数据库字段  用v-html解决Vue.js渲染中html标签不被解析的问题  mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?  Java类加载基本过程详细介绍  零基础网站服务器架设实战:轻量应用与域名解析配置指南  常州企业网站制作公司,全国继续教育网怎么登录?  JS碰撞运动实现方法详解  Win11怎样安装网易有道词典_Win11安装词典教程【步骤】  Laravel如何使用Gate和Policy进行授权?(权限控制)  网站建设要注意的标准 促进网站用户好感度!  香港服务器如何优化才能显著提升网站加载速度?  打造顶配客厅影院,这份100寸电视推荐名单请查收  如何快速生成专业多端适配建站电话?  Laravel怎么写单元测试_PHPUnit在Laravel项目中的基础测试入门  Laravel如何与Docker(Sail)协同开发?(环境搭建教程)  1688铺货到淘宝怎么操作 1688一键铺货到自己店铺详细步骤  Laravel如何实现用户密码重置功能?(完整流程代码)  Laravel定时任务怎么设置_Laravel Crontab调度器配置  如何基于云服务器快速搭建个人网站?  Laravel Facade的原理是什么_深入理解Laravel门面及其工作机制  logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?  微信小程序 五星评分(包括半颗星评分)实例代码  如何基于云服务器快速搭建网站及云盘系统?  Laravel如何实现密码重置功能_Laravel密码找回与重置流程  Bootstrap整体框架之CSS12栅格系统  悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤  Laravel如何构建RESTful API_Laravel标准化API接口开发指南  Laravel怎么实现一对多关联查询_Laravel Eloquent模型关系定义与预加载【实战】  HTML5建模怎么导出为FBX格式_FBX格式兼容性及导出步骤【指南】