MySQL 在执行深度分页时,绝不会一次性将行数据加载到内存中

MySQL深度分页的问题及优化方案:千万级数据量如何快速分页 字节跳动面试官问我海量数据分页如何展示 阅读详情

MySQL 在执行 LIMIT 1000000, 10 时,绝不会一次性将前 100 万行数据加载到内存中。它的执行机制是典型的**“流式逐行处理”**,内存占用是固定且可控的,与 offset 大小无关。

下面从 InnoDB 存储引擎的执行细节为你拆解真实过程:


🔍 实际执行过程(非内存加载,而是流式扫描)

  1. 按页读取,非按行加载
    InnoDB 数据存储在 16KB 的 Page 中。MySQL 会从索引/数据页的起始位置开始,逐页加载到 Buffer Pool 或执行缓冲区,而不是把 100 万行一次性塞进内存。

  2. 逐行解析 + 条件判断 + 丢弃
    对页中的每一行,执行引擎会:

    • 解析行记录结构
    • 评估 WHERE 条件(是否匹配)
    • 参与 ORDER BY 排序比较(如有)
    • 判断当前行序号是否 < offset
    • 若满足跳过条件,直接丢弃,不进入结果集,也不长期驻留内存
  3. 仅保留目标行
    当扫描到第 1000001 行时,才开始将后续 10 行组装成结果集返回给客户端。

  4. 内存使用上限固定
    整个过程使用的内存主要来自几个固定参数:

    • read_buffer_size / read_rnd_buffer_size(顺序/随机读缓冲)
    • sort_buffer_size(排序临时缓冲)
    • tmp_table_size / max_heap_table_size(临时表)
      这些缓冲区大小通常在几 MB 到几十 MB,与 offset 无关。

📉 为什么“不占内存”却依然极慢?

深度分页的性能杀手不是内存,而是以下三项硬成本:

成本类型具体表现影响
🔹 I/O 成本即使数据在 Buffer Pool 中,CPU 仍需从内存页中逐行解析;若未缓存,则触发大量磁盘随机/顺序读取磁盘 IOPS 飙升,响应时间线性增长
🔹 CPU 成本解析 100 万行记录头、解码变长字段、执行 WHERE 过滤、排序比较,消耗大量 CPU 周期查询线程长时间占用 CPU,影响并发
🔹 Buffer Pool 污染大量无关数据页被加载进内存,挤占热点页缓存位置,导致后续查询缓存命中率下降拖慢整个实例的其他查询
🔹 排序放大效应若带 ORDER BY,MySQL 需对过滤后的中间结果集排序。offset 越大,排序数据集越大,可能触发 filesort 或落盘临时表内存/磁盘开销呈指数级上升

✅ 核心结论

LIMIT offset, size 的瓶颈是 “无效扫描的 I/O + CPU 成本”,而非“内存占用”。
MySQL 采用流式处理,内存使用恒定,但扫描行数、回表次数、排序开销会随 offset 线性/指数增长,这才是性能断崖的根源。

这也正是工业界优化深度分页的底层逻辑:

  • 游标分页:直接定位起始点,扫描行数从 O(offset+size) 降至 O(size)
  • 延迟关联:子查询仅扫描索引(不触发表数据回表),大幅降低 I/O 与 CPU 解析成本
  • 覆盖索引:彻底消除回表,让扫描成本趋近于纯内存索引遍历

如果你在实际业务中遇到具体慢查询,可以提供 EXPLAIN 执行计划,我可以帮你精准定位是回表过多、排序开销大,还是 Buffer Pool 命中问题,并给出针对性 SQL 改造方案。

Homebrew 必备软件清单:我的 macOS 开发环境搭建全记录 本文详细介绍了如何使用Homebrew在macOS上搭建高效的开发环境,包括基础配置、核心开发工具链、高效编码工具集等30个必备工具。通过Homebrew这一macOS缺失的包管理器,开发者可以一键安装命令行工具和GUI应用,大幅提升工作效率。文章还提供了日常维护命令和疑难问题解决方案,适合从新手到资深开发者的所有用户。 阅读详情

相关推荐

VMware 虚拟机里连不上网的五种解决方案

在VMware虚拟机里的虚拟机系统连接不上网络 首先,注意查看适配器选项里的网络连接这两个网络连接是否存在,如果不存在可以重新装一下VM 如果存在,连不上网 解决办法一: 虚拟机设置里,找到“网络适配器”,右边的网络连接选择“NAT 模式”,如果不行的话再linux系统。还是不行的话接着看第二种解决方案。 解决方法二: 可能原因是VMware NET Service...

墨轩 18万+

一文彻底弄懂MySQL优化之深度分页

深度分页在处理大数据集时会引发性能问题,但可以通过多种优化策略来改善性能,如基于主键的游标分页、使用索引、懒加载等。选择合适的策略取决于具体的业务需求和数据特性。务必进行性能测试,以找出最适合应用场景的解决方案。lgx211引迈 - JNPF快速开发平台_低代码开发平台_零代码开发平台_流程设计器_表单引擎_工作流引擎_软件架构。

dsgdauigfs的博客 1867

利用ORCAD/pspice 仿真分析电路的幅度相位谱

利用ORCAD的pspice仿真分析电路的相位谱1.介绍2.搭建电路原理图3.建立仿真文件,进行交流分析4.仿真、查看输出5.总结 1.介绍 orcad配合pspice一直是电路原理图绘制和仿真的主要工具,pspice工具提供了诸如暂态分析、直流分析、交流分析等多个工具。学校主要教的是multisim,对orcad讲得很少,最进要利用orcad对运放构成的电路的频响、相移特性进行分析,发现资料幅度...

qq_40011737的博客 1万+

es、MySQL 深度分页问题

es、mysql 深度分页

何xiao树 840

Adobe Acrobat Pro(Adobe PDF) - 使用技巧

Adobe Acrobat Pro为Adobe出品的PDF查看和编辑软件,下文简称Adobe PDF,该软件功能强大,拥有查看PDF、编辑PDF、打印PDF、导出PDF、合并文件、组织页面、文本标注、注释、动作向导、等功能。本文介绍Adobe PDF的一些使用技巧,最后介绍软件设置。

NSJim的博客 4万+

光电系统光轴校准与偏差控制实战指南

光轴作为光电系统的空间基准坐标系,直接影响多光谱传感器的协同工作精度。在包含可见光、红外与激光测距的复合系统中,光轴偏差会导致目标识别误差与打击精度下降。通过机械基准建立、光学通道粗调和多光谱协同校准等工厂级标定流程,结合千米靶标法、星点校准法等野战应急方案,可有效控制光轴偏差。典型应用场景中,温度补偿与振动抑制技术能维持光轴稳定性,如某舰载系统通过500Hz高频视觉伺服实现0.3mrad振动补偿。掌握这些光轴标定与保持策略,对提升光电系统在侦察、测距等场景的实战性能具有关键价值。

weixin_36149538的博客 273

mysql:深度剖析MySQL深度分页问题及高性能解决方案

优先使用游标分页:适合大多数有序场景复杂查询用延迟关联:减少回表操作考虑数据一致性需求:选择合适的事务隔离级别混合存储架构:根据数据热度分层存储监控与调优:持续关注慢查询和分页性能前几页:缓存+常规分页中间页:游标分页深度分页:延迟关联+特殊优化搜索场景:ES专业分页通过以上方案的综合运用,我们成功将淘宝商品列表页的深度分页查询性能提升了20倍以上,字节跳动评论系统的分页接口P99从原来的800ms降低到了50ms以内。

weixin_43290370的博客 2011

【Chipyard】Gemmini快速上手

Gemmini 加速器在 ResNet50 推理任务中表现出计算密集型优势,核心操作周期分布符合深度学习模型特征,推理预测流程完整且测试通过,为后续硬件优化和模型部署提供了有效参考。

2354

深度分页优化

深度分页是指在查询结果集中获取较深页码的数据。例如,在一个数据库查询中,当用户请求第 100 页(每页显示 10 条记录)以后的数据时,就涉及到深度分页。在关系型数据库中,常见的做法是使用。

qq_62097431的博客 1548

ARM6818嵌入式视频播放器:硬解加速与Framebuffer渲染实战

嵌入式Linux音视频系统是智能座舱、工业HMI等场景的核心能力,其本质是软硬协同的实时多媒体处理系统。原理上需打通内核驱动(如VPU硬件编解码、FIMD多图层合成)、用户空间框架(GStreamer pipeline定制、SDL2硬件渲染)与应用层同步机制(PTS/HTS双时钟校准)。技术价值在于显著降低CPU负载(硬解可压至15%以下)、提升启动速度(<1.2s首帧)并保障音画同步精度(±3ms级)。典型应用场景包括车载信息娱乐、边缘AI终端及无X11的工控显示设备。本文基于ARM6818平台,深入VP

weixin_32456485的博客 77

Multisim14.0仿真应用设计(十六)74LS138译码器应用仿真

74LS138为3线-8线译码器。

zhusl6688的博客 2979

实战!如何解决 MySQL 深分页问题

本文旨在深入分析MySQL深分页问题的原因、影响及解决方案,并详细分析底层原理。

Chat2DB的博客 4624

Spark Sql 连接mysql

转载请务必注明原创地址为:http://dongkelun.com/2018/03/21/sparkMysql/ 1、基本概念和用法(摘自spark官方文档中文版) Spark SQL 还有一个能够使用 JDBC 从其他数据库读取数据的数据源。当使用 JDBC 访问其它数据库时,应该首选 JdbcRDD。这是因为结果是以数据框(DataFrame)返回的,且这样 Spark SQL操作轻松或便......

主要分享大数据相关的知识,如Spark、Hudi 1万+

深度分页问题分析和优化

目录数据集深度分页存在的问题深度分页优化 数据集 test_db下载 :https://gitee.com/lzjcnb/test_db 数据集安装:mysql -uroot -p -t < employees.sql 深度分页存在的问题 查询表employess表结果集中第[N,N+m]跳记录,先查看下数据集大小: 分别查询[10000,10003]三条记录和[100000,100003]三条记录,并观察执行时间。 mysql> select * from employees limit 1

huhu123444的博客 9425

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

转载:MySQL深度分页的问题及优化方案-千万级数据量如何快速分页

原文链接: https://blog.youkuaiyun.com/Carson_Chu/article/details/108445426 前言 后端开发中为了防止一次性加载太多数据导致内存、磁盘IO都开销过大,经常需要分页展示,这个时候就需要用到MySQL的LIMIT关键字。但你以为LIMIT分页就万事大吉了么,Too young,too simple啊,LIMIT在数据量大的时候极可能造成的一个问题就是深度分页。 案例 这里我以显示电商订单详情为背景举个例子,新建表如下: CREATE TABLE `cps_us

木小鱼的笔记 1742

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Mysql千万级别数据如何做分页

一、先来看看对SQL优化的理解 SQL优化可分为两个部分,一个是设计阶段,另一个是查询阶段 设计阶段运用到的优化: 使用适当的数据库列类型和大小(需要保证表设计的字段长度足够使用,且最小。比如性别gender字段可以用tinyint(1)即可)。小点的话,可以节省硬盘空间和检索时间。 尽量从设计上采用单表查询解决业务问题。 在适当字段加入索引,能用唯一索引用唯一索引(性能比普通索引高)。 查询阶段涉及的优化: 尽可能不用select *:让优化器无法完成索引覆盖扫...

点滴记忆,分享成长之路 4942

拒绝全表扫描!3个提升MySQL深度分页技巧!

分析MySQL深度分页性能问题,并介绍了3种优化方案:子查询接力、游标分页、索引覆盖等,帮助提高查询效率,解决高页码查询的性能瓶颈。

分享即是最好的学习 1348

MySQL深分页如何优化?

深度分页问题是 MySQL 分页查询中的一个常见难题,但通过合理的优化策略,我们可以有效提升查询效率。索引优化:确保排序和过滤的列上有索引。覆盖索引:减少回表操作,直接从索引中获取数据。标记分页:避免使用OFFSET,通过WHERE子句获取下一页数据。分区表:将大表分成多个分区,减少查询扫描的数据量。缓存结果:缓存分页查询结果,减少数据库负载。使用外部搜索引擎:在复杂场景下,使用 Elasticsearch 或 Solr 等工具。最后分享一份大彬精心整理的大厂面试手册,包含。

weixin_66137383的博客 977

MySQL 面试题——深度分页优化

本文介绍了 MySQL 中深度分页可能引发的问题以及对应的优化方案。

代码星辰的博客 921

从 12s 到 200ms,MySQL 两千万订单数据 6 种深度分页优化全解析

大家好,我是码哥,可以叫我靓仔,《Redis 高手心法》畅销书作者。那晚,大约晚上 11 点,我与 Chaya 在丽江的洱海酒店享受两人世界的快乐,电商平台的运维大群突然炸开了锅。订单查询接口响应时间从200ms 飙升到 12 秒,数据库 CPU 利用率突破 90%。发现事故根源竟是一个看似平常的查询——用户中心的历史订单分页查询。这背后隐藏的正是MySQL 深度分页的典型问题——数据越往后查,速度越让人抓狂。这样的查询,会让数据库像逐页翻阅千页文档的抄写员,机械地扫描前 10 万条记录再丢弃。

m0_73735578的博客 1044

MySQL-深分页问题的背景和影响

MySQL 作为最受欢迎的开源关系数据库之一,被广泛用于各种规模的应用程序中。随着数据量的不断增长,高效地处理大量数据成为数据库管理的重要挑战之一。分页是一种常见的数据检索技术,它允许用户在大量数据中浏览和检索信息,而不必一次性加载所有数据。这对于提高用户体验和减少服务器负载至关重要。然而,当涉及到“深分页”时,即查询大量数据后的页面时,MySQL的性能可能会显著下降。深分页的影响响应时间增加:随着分页深度的增加,查询所需的时间也会增加,导致用户体验下降。

410的博客 1299

分页优化深度解析

本文深度解析数据库分页优化技术,针对传统LIMIT offset方式存在的性能瓶颈,提出8种优化方案:1)索引覆盖查询避免回表;2)延迟关联减少扫描范围;3)书签分页实现稳定性能;4)预加载热点数据;5)数据分区降低单表压力;6)虚拟滚动优化前端体验;7)避免不必要排序;8)合理设置分页大小。通过对比各方案适用场景及优缺点,指出优化核心在于减少数据库扫描范围和IO开销,需结合索引设计、查询优化和缓存策略,根据具体业务场景选择最佳实践。

weixin_43076660的博客 940
上一篇: 为什么深度分页性能极差?
下一篇: Redis 分布式缓存实战指南:常见问题、根因分析与解决方案
龙茶清欢
博客等级 码龄7年 3720粉丝 375原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙茶清欢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值