mysql分页时offset过大的Sql优化经验分享

发布时间 - 2026-01-11 02:40:37    点击率:

发现问题

当我们展示一个列表中的内容时,难免会遇到分页问题,因为列表中的内容数量可能很多,但是用户能一次看到的界面大小是有限的,不可能一个界面展示所有的内容,从后端一次性取太多的数据也会给后端造成额外的压力。

通常分页查询的时候会使用这样的语句:

SELECT
*
FROM table
where condition1 = 0
and condition2 = 0
and condition3 = -1
and condition4 = -1
order by id asc
LIMIT 2000 OFFSET 50000

当offset特别大时,这条语句的执行效率会明显减低,而且效率是随着offset的增大而降低的。

原因为:

MySQL并不是跳过offset行,而是取offset+N行,然后返回放弃前offset行,返回N行,当offset特别大,然后单条数据也很大的时候,每次查询需要获取的数据就越多,自然就会很慢。

优化方案:

SELECT
*
FROM table
JOIN
(select id from table
where condition1 = 0
and condition2 = 0
and condition3 = -1
and condition4 = -1
order by id asc
LIMIT 2000 OFFSET 50000)
as tmp using(id)

或者

SELECT a.* FROM table a, 
(select id from table
where condition1 = 0
and condition2 = 0
and condition3 = -1
and condition4 = -1
order by id asc
LIMIT 2000 OFFSET 50000) b 
where a.id = b.id

先获取主键列表,再通过主键查询目标数据,即使offset很大,也是获取了很多的主键,而不是所有的字段数据,相对而言效率会提升很多。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。


# mysql  # 分页  # offset  # sql  # 分页sql  # MySql分页时使用limit+order by会出现数据重复问题解决  # 为什么MySQL分页用limit会越来越慢  # mysql分页的limit参数简单示例  # 浅谈MySQL分页Limit的性能问题  # MySQL分页Limit的优化过程实战  # mysql分页性能探索  # 浅析Oracle和Mysql分页的区别  # SpringMVC+Mybatis实现的Mysql分页数据查询的示例  # 利用Spring MVC+Mybatis实现Mysql分页数据查询的过程详解  # MySQL分页分析原理及提高效率  # MySQL优化案例系列-mysql分页优化  # 你应该知道的PHP+MySQL分页那点事  # MYSQL分页limit速度太慢的优化方法  # MySQL分页优化  # MySQL分页技术、6种分页方法总结  # 8种MySQL分页方法总结  # mysql分页原理和高效率的mysql分页查询语句  # MySQL的几种分页方式  # 你知道几种方式  # 主键  # 后端  # 就会  # 不可能  # 太多  # 列表中  # 这条  # 越多  # 当我们  # 会给  # 这篇文章  # 谢谢大家  # 很慢  # 跳过  # 单条  # 而不是  # 有疑问  # brush  # SELECT 


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


相关推荐: Python数据仓库与ETL构建实战_Airflow调度流程详解  Laravel Debugbar怎么安装_Laravel调试工具栏配置指南  如何在建站之星网店版论坛获取技术支持?  北京企业网站设计制作公司,北京铁路集团官方网站?  Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】  Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧  详解Android——蓝牙技术 带你实现终端间数据传输  怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?  网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?  西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?  Laravel中的withCount方法怎么高效统计关联模型数量  HTML5建模怎么导出为FBX格式_FBX格式兼容性及导出步骤【指南】  Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门  大学网站设计制作软件有哪些,如何将网站制作成自己app?  html5怎么画眼睛_HT5用Canvas或SVG画眼球瞳孔加JS控制动态【绘制】  Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤  家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?  javascript中闭包概念与用法深入理解  Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置  Laravel如何处理文件上传_Laravel Storage门面实现文件存储与管理  米侠浏览器网页背景异常怎么办 米侠显示修复  Windows10怎样连接蓝牙设备_Windows10蓝牙连接步骤【教程】  如何在服务器上三步完成建站并提升流量?  如何快速建站并高效导出源代码?  Laravel如何使用.env文件管理环境变量?(最佳实践)  Laravel如何实现数据库事务?(DB Facade示例)  Laravel怎么连接多个数据库_Laravel多数据库连接配置  JS碰撞运动实现方法详解  php静态变量怎么调试_php静态变量作用域调试技巧【解答】  Laravel如何处理异常和错误?(Handler示例)  javascript基于原型链的继承及call和apply函数用法分析  HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】  制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?  如何在企业微信快速生成手机电脑官网?  微信公众帐号开发教程之图文消息全攻略  悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤  Laravel Docker环境搭建教程_Laravel Sail使用指南  微信小程序 wx.uploadFile无法上传解决办法  php嵌入式断网后怎么恢复_php检测网络重连并恢复硬件控制【操作】  Laravel如何实现多表关联模型定义_Laravel多对多关系及中间表数据存取【方法】  如何在Windows虚拟主机上快速搭建网站?  Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】  JS实现鼠标移上去显示图片或微信二维码  BootStrap整体框架之基础布局组件  为什么要用作用域操作符_php中访问类常量与静态属性的优势【解答】  Laravel Eloquent:优雅地将关联模型字段扁平化到主模型中  北京网页设计制作网站有哪些,继续教育自动播放怎么设置?  Laravel如何使用Gate和Policy进行权限控制_Laravel权限判定与策略规则配置  Laravel如何编写单元测试和功能测试?(PHPUnit示例)  三星网站视频制作教程下载,三星w23网页如何全屏?