SQL数据库分页查询优化_limit深分页解决方案

发布时间 - 2026-01-07 00:00:00    点击率:
深分页性能差因需扫描前N行;优化应改用游标分页,基于单调字段(如created_at)记录上页末值,下页查询WHERE created_at

深分页(比如 LIMIT 1000000, 20)在SQL中性能急剧下降,本质是数据库仍需扫描前100万行才能定位到目标数据。优化核心不是“跳过”,而是“避免全量偏移扫描”。

用游标分页替代 OFFSET

适用于按时间、ID等单调字段排序的场景。不依赖行号,而是记录上一页最后一条的排序值,下一页查询直接从该值之后取数据。

  • 原写法(慢):SELECT * FROM orders ORDER BY created_at DESC LIMIT 100000, 20
  • 优化写法(快):SELECT * FROM orders WHERE created_at
  • 关键:确保 created_at 有索引;若存在相同值,需加唯一字段(如 id)做二级排序和条件补充

延迟关联减少回表成本

当分页字段和查询字段来自不同索引时,MySQL可能先用索引查出ID,再回表取完整数据——深分页会让这个过程变得极重。

  • 低效写法:SELECT id, name, status FROM user WHERE status = 1 ORDER BY id LIMIT 100000, 20
  • 优化写法:SELECT u.* FROM user u INNER JOIN (SELECT id FROM user WHERE status = 1 ORDER BY id LIMIT 100000, 20) t ON u.id = t.id
  • 原理:子查询只走索引(覆盖索引),拿到20个ID后,主表再精确回表,大幅降低I/O

物理分页 + 缓存预热

对访问规律强的分页(如热门榜单第1–100页),可提前计算并缓存结果。

  • 后台定时任务生成各页的ID列表(如 Redis 中存 rank:page:5[1022, 1025, ...]
  • 用户请求第5页时,直接用这些ID批量查详情:SELECT * FROM item WHERE id IN (1022,1025,...)
  • 适合读多写少、分页内容变化不频繁的业务,如商品排行榜、文章热榜

限制最大页码或改用搜索/筛选

技术优化之外,更应审视产品逻辑:用户真的需要翻到第5万页吗?

  • 前端限制 OFFSET 不超过 10000(即最多查到第500页,每页20条)
  • 提供搜索框、时间范围、分类筛选,帮用户快速定位,而不是靠盲目翻页
  • 对管理后台等特殊场景,可启用“导出全部”代替深度浏览

不复杂但容易忽略:深分页问题往往在数据量突破百万后才暴露,上线前用真实数据量压测分页接口,比事后救火更有效。


# mysql  # redis  # 前端  # red  # sql  # select  # 接口  # 数据库  # 分页  # 行号  # 到第  # 最多  # 下一页  # 上一页  # 适用于  # 每页  # 会让  # 不超过 


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


相关推荐: 如何在IIS7上新建站点并设置安全权限?  Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门  Laravel队列由Redis驱动怎么配置_Laravel Redis队列使用教程  网站建设整体流程解析,建站其实很容易!  如何挑选优质建站一级代理提升网站排名?  javascript读取文本节点方法小结  Laravel如何为API编写文档_Laravel API文档生成与维护方法  详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)  Laravel Vite是做什么的_Laravel前端资源打包工具Vite配置与使用  Microsoft Edge如何解决网页加载问题 Edge浏览器加载问题修复  Android滚轮选择时间控件使用详解  Laravel的Blade指令怎么自定义_创建你自己的Laravel Blade Directives  如何在 Telegram Web View(iOS)中防止键盘遮挡底部输入框  Laravel与Inertia.js怎么结合_使用Laravel和Inertia构建现代单页应用  phpredis提高消息队列的实时性方法(推荐)  三星网站视频制作教程下载,三星w23网页如何全屏?  Laravel Admin后台管理框架推荐_Laravel快速开发后台工具  Windows10怎样连接蓝牙设备_Windows10蓝牙连接步骤【教程】  Laravel策略(Policy)如何控制权限_Laravel Gates与Policies实现用户授权  Laravel如何连接多个数据库_Laravel多数据库连接配置与切换教程  深圳网站制作的公司有哪些,dido官方网站?  关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)  如何快速搭建支持数据库操作的智能建站平台?  深圳网站制作平台,深圳市做网站好的公司有哪些?  Laravel如何创建自定义Facades?(详细步骤)  laravel怎么使用数据库工厂(Factory)生成带有关联模型的数据_laravel Factory生成关联数据方法  如何在橙子建站中快速调整背景颜色?  软银砸40亿美元收购DigitalBridge 强化AI资料中心布局  WordPress 子目录安装中正确处理脚本路径的完整指南  非常酷的网站设计制作软件,酷培ai教育官方网站?  高端企业智能建站程序:SEO优化与响应式模板定制开发  Android GridView 滑动条设置一直显示状态(推荐)  ChatGPT 4.0官网入口地址 ChatGPT在线体验官网  音乐网站服务器如何优化API响应速度?  如何用AI帮你把自己的生活经历写成一个有趣的故事?  html5如何实现懒加载图片_ intersectionobserver api用法【教程】  Gemini怎么用新功能实时问答_Gemini实时问答使用【步骤】  Android实现代码画虚线边框背景效果  Laravel PHP版本要求一览_Laravel各版本环境要求对照  如何用wdcp快速搭建高效网站?  如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?  香港服务器部署网站为何提示未备案?  Laravel路由Route怎么设置_Laravel基础路由定义与参数传递规则【详解】  如何快速搭建高效服务器建站系统?  Laravel如何设置定时任务(Cron Job)_Laravel调度器与任务计划配置  如何在建站之星绑定自定义域名?  google浏览器怎么清理缓存_谷歌浏览器清除缓存加速详细步骤  手机网站制作与建设方案,手机网站如何建设?  Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性  CSS3怎么给轮播图加过渡动画_transition加transform实现【技巧】