解决MySQL使用limit偏移量较大效率慢的问题

大数据量limit分页优化 背景 在通常的业务场景中,分页一般是使用MySQL提供的 limit 来实现从数据库中获取指定偏移量的数据行。在数据量较小的场景中,并没有太大的问题,但当数据量膨胀到一定程度,获取靠后的分页数据时,性能下降就会特别的大。 原因在于MySQL需要根据偏移量扫描出所有符合的数据,然后再从中取分页记录数返回,其余数据全部丢弃。如 select * from t limit 100000, 10; MySQL需要扫描 100010 行数据并返回最后的10条。 解决方案 1.限制分页数量(减少... 阅读详情

问题描述

在MySQL中,LIMIT OFFSET偏移量特别大时,效率会非常低

如果说LIMIT 1000,10,一个偏移量很小的值,一般是没有问题的。但是,比如说,LIMIT 10000000,10时就有些费劲了,让你等到花儿都谢了是没有问题的。


原因分析:

究其原因,是因为MySQL的查询并非先跳过10000000条,再查询10条,而是先查询再跳过。所以上面例子,要先查询出10000000行之后,再取10条,速度当然很慢,并且跳过的行数越多,会越慢。


解决方案:

  • 方法A,使用索引
    可以使用 id > 10000000的方式诱导MySQL使用主键索引。

    这样的Where语句MySQL是非常喜欢并且乐于执行的,因为你给到MySQL的是一个范围,它最容易执行的就是有序和范围的查询,这对它来说易如反掌。

    当然,使用这个方法需要注意,id最好是连续的,中间的记录没有被物理删除过。如果其中有数据被物理删除过,用在分页场景的话,就看起来不是那么的优雅。当然,大部分数据库的参与者都倾向于逻辑删除。即便是物理删除的话,也可以使用程序去做区分显示,这不是问题。

  • 方法B,迂回战术-延迟关联技巧
    这个方法在《高性能MySQL》中也有提到,所谓延迟关联(deferred join),就是通过使用覆盖索引查询返回需要的主键,再根据主键关联原表获得需要的数据。原理还是想方设法利用索引的速度,方可以柔克刚。

    假设,有一张表保存了学生的名字,然后要执行这样的sql:

    select id,name from student limit 1000000,10;

    这样执行的效率必然会很慢

    将SQL改写:

    SELECT id,name FROM student INNER JOIN (SELECT id FROM student LIMIT 1000000,10) stu ON student.id = stu.id;

    可以看到,在上述语句的子查询中,“SELECT id FROM student LIMIT 1000000,10”只查询了主键id一个字段,对于这样的索引覆盖情况,查询速度还是可以接受的。就等于说,该子查询只返回了10个id给上级查询。

    上级查询接收到这10个id之后,迅速的查询出了“name”字段,速度得到了极大提升。

mysql面试题19:MySQL中limit 1000000 加载很慢的话,你是怎么解决的呢? MySQL在面对大LIMIT值时性能下降的情况,主要是因为要生成和处理大量的临时数据。以下是一些处理方法及具体应用示例 阅读详情

相关推荐

【MySQL】MySQL 用offset 和 limit 分页性能太差!

随着时代的进步,随着野心勃勃的企业想要变成下一个 Facebook,随着为机器学习预测收集尽可能多数据的想法的出现,作为开发人员,我们要不断地打磨我们的 API,让它们提供可靠和有效的端点,从而毫不费力地浏览海量数据。

wjianwei666的专栏 886

给你讲讲五年前在腾讯遇到的,海量数据分页场景(limit,offset)为什么会慢

链接:http://t.cn/AidABz08从一个问题说起五年前在腾讯的时候,发现分页场景下,mysql请求速度非常慢。数据量只有10w的情况下,select xx f...

xmt1139057136的专栏 931

mysql的limit用法、逻辑分页和物理分页

mysql的limit用法、逻辑分页和物理分页

念兮为美 3万+

【MySQL Tips】偏移量大的分页查询LIMIT子句的优化方法

【MySQL Tips】偏移量大的分页查询LIMIT子句的优化方法

影三人 1833

用MATLAB从零实现六足机器人步态仿真:交替三角与波动步态保姆级教程

本文详细介绍了如何使用MATLAB从零实现六足机器人的两种经典步态仿真:交替三角支撑步态和波动步态。通过参数定义、相位设置、运动轨迹生成和三维可视化等步骤,帮助读者掌握六足机器人步态规划的核心技术。教程包含完整代码和详细解析,适合机器人爱好者和相关专业学生学习实践。

weixin_26765363的博客 228

231003-四步MacOS-iPadOS设置无线竖屏随航SideCar

新建虚拟屏幕参考文献。

专注机器学习之路 7487

mysql limit 很慢_MySQL limit分页大偏移量慢的原因及优化方案

这篇文章主要介绍了MySQL limit分页大偏移量慢的原因及优化方案,帮助大家更好的理解和使用MySQL数据库,感兴趣的朋友可以了解下在 MySQL 中通常我们使用 limit 来完成页面上的分页功能,但是当数据量达到一个很大的值之后,越往后翻页,接口的响应速度就越慢。本文主要讨论 limit 分页大偏移量慢的原因及优化方案,为了模拟这种情况,下面首先介绍表结构和执行的 SQL。场景模拟建表语句...

weixin_33680141的博客 3467

dify工作流的原理

摘要: Dify 工作流是一个基于有向无环图(DAG)的智能任务编排系统,支持多节点(如LLM调用、API工具、条件分支等)的可视化拖拽与流程编排。其核心原理包括执行引擎(解析DAG并管理节点依赖)、上下文变量传递(类Jinja模板的变量引用机制)和状态持久化(存储执行日志与中间结果)。工作流通过事件驱动执行,支持异步任务调度,并与RAG知识库、LLM服务等模块深度集成,最终可发布为API或对话应用。技术栈基于Python(FastAPI+Celery)和PostgreSQL,实现低代码化的AI应用开发。

nbspzs的专栏 2187

015 MySQL 中 limit 分页偏移量过大导致查询慢的优化

学软件技术,读第一手资料,去官方网站:MySQL 5.7参考手册 也可以看看比较经典的书籍,如《高性能MySQL》等 1、简单回顾MySQL中的 limit 的用法 假如你的需求是:从第几条开始总共返回多少条。这时候你将会用到MySQL中的limit。 语法:SELECT * FROM table LIMIT [offset,] rows mysql> SELECT * FROM table LIMIT 5,10; // 检索记录行 6-15 //为了检索从某一个偏移量到记录集的结束所有

从2026-09-21开始专注于AI,以前是后端研发、大数据研发等 2776

vit的cam和注意力图: VIT模型的可解释性

VIT的热力图怎么画

YI_SHU_JIA的博客 1万+

华为OD机考双机位C卷 - 信道分配(Java & Python& JS & C/C++ & GO )

华为OD机考双机位C卷 - 信道分配

算法大师! 453

【MySQL篇】limit深度分页性能:从原理理解小偏移量limit 1,200 vs 百万级偏移量limit 1000000,200的差异

MySQL 中的 LIMIT 子句用于限制查询返回的行数,其核心原理是在查询处理过程中提前终止结果集的生成。

奈斯DB的博客 1362

【StarRocks】-- DATETIME 与 TIMESTAMP 区别详解

本文详细解析了StarRocks中DATETIME/DATETIMEV2与TIMESTAMP的区别及使用场景。DATETIME系列存储人类可读时间,不携带时区;TIMESTAMP实际指Unix时间戳,建议用BIGINT存储。关键差异包括:精度选择(DATETIMEV2支持微秒级)、时区处理(仅函数计算时影响)、存储方式等。针对不同场景提供选型建议:单时区展示用DATETIMEV2,跨时区计算用BIGINT存储Epoch。特别强调与MySQL迁移时的注意事项,并给出常见问题解决方案和最佳实践清单,包括统一入口

欢迎来到我的博客,一起探索代码里的世界! 498

解决MySQL中LIMIT大偏移量加载慢的问题

处理MySQL中大偏移量的LIMIT查询时,关键在于减少数据库需要扫描的数据量。通过利用已知的最大ID值、限制分页深度、优化索引使用以及采用子查询或延迟关联等技术,可以有效地提升查询性能。同时,与业务团队紧密合作,共同设计合理的数据展示策略,也是解决这类问题的重要途径。

sheji888的专栏 1126

RK3588 hdmirx 调试(含v4l2工具,edid编辑)

RK3588 Buildroot系统中调试HDMI-RX的过程,包括抓图、修改EDID数据、编辑EDID等操作。首先,通过logcat和寄存器信息查询HDMI-RX的状态,使用v4l2-ctl工具进行测试和修改EDID。

501846585_QQAndroid_java 2685

【Burp入门第三十三篇】BurpSuite+Proxifier安装配置,实现微信小程序抓包

本文介绍Burp+Proxifier安装配置,实现微信小程序抓包

等风来 5873

mysql limit 偏移量_MySQL limit分页大偏移量慢的原因及优化方案

在 MySQL 中通常我们使用 limit 来完成页面上的分页功能,但是当数据量达到一个很大的值之后,越往后翻页,接口的响应速度就越慢。本文主要讨论 limit 分页大偏移量慢的原因及优化方案,为了模拟这种情况,下面首先介绍表结构和执行的 SQL。场景模拟建表语句user 表的结构比较简单,id、sex 和 name,为了让 SQL 的执行时间变化更加明显,这里有9个姓名列。CREATE TABL...

weixin_36165049的博客 980

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

MySQL优化:使用 LIMIT 进行分页查询时,偏移量过大造成查询性能降低问题分析

尽量让查询所需的列都包含在索引中,这样在查询过程中可以直接从索引里获取数据,减少回表操作(回表指的是先通过索引找到主键,再根据主键去数据表中查找其他列数据的过程)。先通过一个子查询快速定位到我们真正想要获取的数据所在的 id 范围(也就是 “关键的 id 段”),然后再通过关联操作获取这些 id 对应的数据行的完整信息。(上次登录日期)等,现在需要按照用户的注册日期倒序分页展示用户信息,且要获取从第 5000 条记录开始的 10 条用户记录。的联合索引,让查询直接从索引中获取这些数据,提升效率。

weixin_43833540的博客 1133

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

mysql分页查询limit中偏移量offset过大导致性能问题

在业务中经常会遇到关于分页的需求,这就会经常会用到MySQL中的limit offset,rows来分段取出每页中需要的数据。但是当数据量足够大的时候,limit条件中的偏移量offset越大就越会导致性能问题,导致查询耗时增加严重。先看一下测试: -- 本地库中只有二百多万条数据,访者可以在本地将数据写入到千万条做测试。效果会更明显 select count(*) from notes; ...

极客神殿 3273

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

mysql limit分页_MySQL中limit分页大偏移量的原因分析与优化方案

在 MySQL 中通常我们使用 limit 来完成页面上的分页功能,但是当数据量达到一个很大的值之后,越往后翻页,接口的响应速度就越慢。本文主要讨论 limit 分页大偏移量慢的原因及优化方案,为了模拟这种情况,下面首先介绍表结构和执行的 SQL。场景模拟建表语句user 表的结构比较简单,id、sex 和 name,为了让 SQL 的执行时间变化更加明显,这里有9个姓名列。CREATE 数据填充...

weixin_39744606的博客 363

关于mysql 中的limit 偏移量较大时 的使用 建议

select  *   f rom  table  limit ..  偏移量较小的时候  使用  SELECT  *  from use  order by  id LIMIT 10,10 的时候有 优势  速度较快 ,   mysql  可以很快的从 结果 集中 筛选出 前面的 结果  返回.. 偏移量较大的 时候使用 SELECT  *  from user   WHERE id>=(S

chenyusbyongde的博客 1618

MySQL 分页查询优化:LIMIT 偏移量的坑

MySQL 提供的 LIMIT offset, size 是最常用的分页方式,但如果你在大数据量场景下使用,就很可能会掉进性能的“陷阱”。如果你在生产环境中遇到分页慢的问题,不妨先分析 SQL 的执行计划,再结合具体场景选择合适的优化策略。如果分页查询的数据需要频繁访问,可以考虑将结果写入缓存或临时表,然后分页读取,避免每次都全表扫描。这种方式非常高效,因为只依赖主键索引扫描,适合顺序加载的场景(如滚动加载、无限下拉)。最常见的优化方式是利用索引来“定位”分页的起点,而不是依赖 MySQL 丢弃数据。

weixin_44118965的博客 967

MySQL limit子句及分页应用

Limit子句可以被用于强制 SELECT 语句返回指定的记录数。Limit接受一个或两个数字参数。 参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量, 第二个参数指定返回记录行的最大数目。 //初始记录行的偏移量是 0(而不是 1): mysql> SELECT * FROM table LIMIT 5,10; //检索记录行6-15 //为了检索从某一个偏...

qq_37857921的博客 2703

mysql limit 含义_深入分析Mysql中limit的用法

很久没用mysql的limit,一时大意竟然用错了,自认为(limit 开始,结束),其实错了,正确的应该是(limit 偏移量,条数),为了记住这次错误,转载一篇limit用法详解。推荐给大家,希望对大家能够有所帮助。Mysql中limit的用法:在我们使用查询语句的时候,经常要返回前几条或者中间某几行数据,这个时候怎么办呢?不用担心,mysql已经为我们提供了这样一个功能。SELECT * F...

weixin_39867893的博客 2787

Mysql的limit用法

1、Mysql的limit用法 在我们使用查询语句的时候,经常要返回前几条或者中间某几行数据,这个时候怎么办呢?不用担心,mysql已经为我们提供了这样一个功能。 SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset LIMIT 子句可以被用于强制 SELECT 语句返回指定的记录数。LIMIT 接受一个或两...

测试之路 1万+

mysql 分页查询limit中偏移量offset过大导致性能问题

      在业务中经常会遇到关于分页的需求,这就会经常会用到MySQL中的limit offset,rows来分段取出每页中需要的数据。但是当数据量足够大的时候,limit条件中的偏移量offset越大就越会导致性能问题,导致查询耗时增加严重。先看一下测试: -- 本地库中只有二百多万条数据,访者可以在本地将数据写入到千万条做测试。效果会更明显 select count(*) from no...

Jacob的博客 8361
下一篇: 什么是SpringMVC
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值