Mysql分页:高效处理海量数据的核心技术

mysql数据库实现数据分页详解 在MySQL数据库中,实现数据分页通常使用LIMIT和OFFSET子句。这些子句使得查询结果可以分批返回,从而实现分页功能。在MySQL中实现分页有多种方法,每种方法都有其适用的场景和优缺点。选择哪种方法取决于具体的应用场景、数据量以及性能要求。在实际应用中,通常会根据需求选择最适合的分页方式,并在应用程序中集成分页逻辑,通过传递页码和每页记录数参数来动态生成SQL查询语句。 阅读详情

在这里插入图片描述

01 引言

在Web应用、移动应用或数据分析场景中,数据库常常需要处理百万甚至千万级的数据记录。一次性加载所有数据不仅效率低下,还会消耗大量网络带宽和内存资源。数据库分页技术正是解决这一挑战的关键方案。

在日常开发中,对于列表页面的查询、全链路操作日志等,数据的结果集可以无限增大或者数据量本身很大的场景,我们常常会增加分页,以避免一次性全量加载带来的内存、IO的压力。

02 分页方式

为了测试需要,按照ID顺序插入了100万的数据。

下面是分页插件展示的效果:
在这里插入图片描述

2.1 LIMIT-OFFSET

脚本

-- 获取第3页(每页10条)
select * from user_info order by id asc LIMIT 10 OFFSET 20;

LIMIT后面跟的事查询的数据数量,而OFFSET后面跟的是数据偏移量,也就是要跳过的数据量。

结果
在这里插入图片描述

页数计算:

  • 第一页:1~10
  • 第二页:11~20
  • 第三页:21~30

这种分页的方式,小编之前是不知道的,在查线上问题的时候偶然看到一段代码块,就好奇的点进去看了看:

在这里插入图片描述

才发现原来这样也可以分页,真的是涨知识了。

2.2 LIMIT X,Y

limit x,y 是小编常用的分页方式,x指偏移量,同offset。而y则指需要查询的数量。

脚本

-- 获取第3页(每页10条)
select * from user_info order by id asc LIMIT 20, 10;

结果

在这里插入图片描述

这种方式可能是习惯了,用起来感觉更加顺手。

03 分页使用注意事项

查询的结果的分页用起来比较简单,但是使用不当的话就会出现与期望偏差的数据。

3.1 语法

语法很简单,需要LIMIT关键字。

  • LIMIT ${偏移量},${要显示的记录数}
  • LIMIT ${要显示的记录数} OFFEST ${偏移量}

两者任选其一。

3.2 执行顺序

分页一定是最后需要执行或者处理的,无论简单的脚本还是复杂的脚本都是在语句的结尾。

脚本

-- 聚合查询
select age, count(*) from user_info GROUP BY age HAVING age > 30 ORDER BY age LIMIT 20, 10;

结果

在这里插入图片描述

页数计算:

  • 第一页:31~40
  • 第二页:41~50
  • 第三页:51~60

3.3 单条数据的查询

在业务代码中,我们如何查询一条数据呢?Mapper的查询结果中,返回的结果是一个数据集,要查询一条数据我们一般都是取集合中的第一条。

例如:我们需要再数据库中找到一个18岁的女孩。

脚本

select * from user_info WHERE age=18 AND sex='女';

结果

在这里插入图片描述

伪代码

List<UserInfo> userList = userInfoService.selectByAgeAndSex(18, "女");
return CollectionUtils.isNotEmpty(userList) ? userList.get(0) : null;

乍一看代码似乎没有什么问题,结果是确实返回了一条。但是Mysql结果集有很多数据,需要加载到内存中甚至在微服务之间传输,这样的无疑增加了资源的消耗。

我们可以直接从数据库中只查一条数据就好了,没有必要都查出来。我们需要使用LIMIT的另一语法:

  • LIMIT 要返回的数据量 【LIMIT 1 :返回一条数据】
select * from user_info WHERE age=18 AND sex='女' LIMIT 1;

在这里插入图片描述

3.4 深分页问题

深分页是一个无聊的话题,但是确实面试的一个考察点。

select * from user_info LIMIT 800000,10;

这已经翻了8w页了,还要继续翻么?这就是所谓的深分页。谁会这么干!

当然了,这样的查询语句的效率是低下的,测试的数据比较简单耗时大概1084ms。如何去优化呢?

主要原因是没有使用到覆盖索引,此时为了得到完整记录就需要回表,而回表是随机磁盘IO,速度慢消耗大。

解决办法就是减少回表次数:

-- 根据ID自增特性
select * from user_info WHERE id > 800000 limit 10;

-- 自关联,减少回表次数
select * from user_info u INNER JOIN (select id from user_info LIMIT 800000,10) uu ON uu.id=u.id;

从一定程度上可以提高响应速度,测试结果分别可以的达到758ms、915ms

04 分页公式

4.1 总页数计算

分页需要我们来计算。首先我们需要知道总共有多少数据(count),每页多少数据(length),这样我们才能知道能分多少页(total)。

// 总页数total的计算公式
int total = (int) Math.floor((this.count * 1.0d) / this.length);
if (this.count % this.length != 0) {
    // 除不尽,需要页数+1
    this.total++;
}

注意:这里是Math.floor()向下取整,然后总记录数除不尽每页的数量,页数就是+1。

4.2 偏移量计算

偏移量的计算需要知道当前是多少页(current)了。

// 计算偏移量
int offset = (this.current - 1) * this.length;

4.3 分页的使用

  • 通过上面的公式自定义分页
  • 使用第三方的分页,如cn.hutool.db.PageResult

05 小结

我们习惯了三方库的分页,可能从来都没有自己去实现过分页或者封装都属于自己框架的分页,赶快去试试吧。

Mysql 数据库中怎么实现分页 的性能会随着偏移量的增加而变得更差,因为它需要跳过指定数量的行。在处理大数据集时,可能需要考虑使用其他优化方法,例如基于游标的分页查询。在计算偏移量时,我们将页数减去 1,以得到正确的偏移量。另外,为了确保分页查询的结果是按照期望的顺序返回,通常需要在查询中包含适当的排序条件,例如使用。使用这个公式,可以将它应用到查询中,以获取特定页的数据。上述查询将返回从第 21 行开始的 10 条记录,即第 3 页的数据。这将返回结果集中第 21 行到第 30 行的数据。是结果集的偏移量,表示从第几行开始返回结果, 阅读详情

相关推荐

Kettle(六)高效分页迁移MySQL数据实战

本文详细介绍了使用Kettle进行高效分页迁移MySQL数据的实战方法。针对海量数据迁移的痛点,通过作业与转换的组合,构建了“先算页,再循环”的架构。文章重点讲解了分页查询的SQL优化技巧、批量插入的性能调优参数设置,并分享了监控、错误处理及规避常见问题的实战经验,旨在实现稳定可控的大数据量迁移。

weixin_29304985的博客 243

MySQL的分页你还在使劲的limit?

然后再用这100个id去跟t1表做id匹配,此时走的是主键索引,将匹配到的100条行数据返回。当然,这种写法存在一定问题,如果第0页的id=5的数据被删除了,就会导致查询第0页的数据和第1页的数据有重合,第0页是1-4,6-11(默认一页10条数据,因为limit10,所以会查询到id=11),第二页就是11-20,可见id=11重合了。但不同的地方在于,在返回server层的过程中,只会拷贝数据行内的id这一列,而不会拷贝数据行的所有列,当数据量较大时,这部分的耗时还是比较明显的。...

我惠依旧的博客 1万+

高效分页技术:提升MySQL海量数据分页性能的新方法

这样,在执行分页查询时,MySQL可以利用索引的有序性,快速定位到需要的页数,并返回结果,而无需全表扫描。本文将介绍一种新的高性能分页方法,通过对查询语句和索引的优化,显著提升MySQL在海量数据分页中的查询效率。通过这种新的分页方法,我们可以显著提高MySQL在海量数据分页查询中的性能。然而,需要注意的是,索引的创建和维护可能会对数据库的写入性能产生一定的影响。这样,MySQL可以利用索引的有序性,快速定位到第1001条记录,并返回接下来的10条记录,而无需扫描整个表。

ThDebug的博客 192

8种MySQL分页方法总结

今天在做数据库练习的时候由于数据有点多,一下全部显示出来不好看,看着比较乱,所以在查了一下怎么让MySQL分页找到了一篇不错的文章,在这里分享给大家。如果有帮到大家麻烦点个赞。谢谢。 方法1: 直接使用数据库提供的SQL语句 —语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 LIMIT M,N。 —适应场景: 适用于数据量较少的情况(元组百/千级)。 —原因/缺点: 全表扫描,速度会很慢 且 有的数据库结果集返回不稳定(如某次返回1,2,3,另外的一次返回2,1,3)。Li.

weixin_44096353的博客 1万+

Mysql海量数据经常有下面这些操作,离被开除就不远了(持续更新)

LOAD DATA INFILE是一个高度优化的批量加载数据的操作,它直接从文件读取数据并插入到表中,减少了中间的缓存和转换过程,对于海量数据的插入效率更高。查询会返回一个表中的所有列,这在海量数据的情况下会导致非常大的数据量传输,增加了网络带宽的负担,并且消耗了大量的内存,降低查询效率。时,MySQL必须遍历所有表的记录,产生大量的中间结果,这会消耗大量的CPU和内存资源。进行排序会导致全表扫描和排序,消耗大量的I/O和CPU资源,特别是在数据量较大时,可能会导致查询效率急剧下降。

大模型大数据攻城狮的专栏 1107

MyBatis分页详解与高效实战应用

MyBatis 是一款支持自定义 SQL、存储过程和高级映射的持久层框架,它消除了几乎所有的 JDBC 代码和手动参数设置与结果集封装。与传统的 ORM 框架(如 Hibernate)不同,MyBatis 更加贴近 SQL,允许开发者精准控制每一条 SQL 语句的执行行为。虽然PageHelper提供了强大的分页能力,但在某些场景下仍需自定义Page对象以满足特定业务需求,例如支持排序、筛选、扩展字段等。自定义Page对象应包含基本的分页信息和查询结果数据。

weixin_33068055的博客 1078

MySQL基础(1) 分页查询 函数 过程

delimiter 结束表示create procedure 存储过程名()BEGIN程序体end;结束表示例1:选择$$作为结束表示 过程:把值插入表中VALUESNULL,'20',NOW());END $$

xjdkxnhcoskxbco的博客 6100

Java+MySQL分页查询实战案例详解

在分页系统中,和pageSize是两个最基础且关键的参数。其中,表示用户希望查看的是第几页的数据,默认从第1页开始计数;而pageSize则表示每一页展示多少条记录,通常由前端提供或系统设定默认值(如10、20、50等)。这两个参数共同决定了数据查询的偏移位置与返回数量。以一个商品列表为例,若用户请求第3页,每页显示15条,则数据库需要跳过前条记录,并取出接下来的15条。这一计算公式为后续SQL中的OFFSET和LIMIT提供了数学依据。值得注意的是,尽管某些系统允许。

weixin_33431149的博客 945

MySQL分页查询深度解析从LIMIT优化到海量数据解决方案

MySQL分页查询的优化是一个由浅入深的过程。对于中小数据量,优先考虑通过索引优化和改变分页方式(如游标分页)来提升性能。对于海量数据,则需要从架构层面着手,结合分库分表、搜索引擎和缓存等技术来构建解决方案。在实际应用中,应根据数据规模、业务场景和性能要求,选择最合适的分页策略,并在用户体验和系统负载之间找到平衡点。

weixin_43139059的博客 914

224G PAM-4 通道的 PCB 和封装设计

该行业正在努力实现层厚非常低的 sub-Dk = 3 材料,以及更先进的加工,这将使封装和 PCB 中的透射电镜截止值更高。当回波损耗占主导地位时,我们基本上需要去除沿互连产生阻抗失配的任何元件,就像上面描述的更光滑的铜和更低的 Dk 值一样。第二个影响是传输线阻抗匹配在 56 GHz 范围内的非常高的频率下非常困难的主要原因之一,另一个因素是 Tx 或 Rx 封装/缓冲器中的寄生效应。由于 PCB 和封装中的长度刻度,这是 BGA 上的焊盘、过孔和球等小结构开始在输入阻抗中产生明显偏差的频率范围。

jkh920184196的博客 843

传输线末端短路、开路、加电感的反射系数

时,频率变化约300MHz, 出现这种偏差是因为我们的计算中将电磁波传播速率默认为。时,频率变化约300MHz, 出现这种偏差是因为我们的计算中将电磁波传播速率默认为。下图为用网络分析仪实测一长度为30cm的传输线末端加一0.6uH的线圈的反射系数。下图为用网络分析仪实测一末端短路的长度为30cm的传输线的反射系数。下图为用网络分析仪实测一末端开路的长度为30cm的传输线的反射系数。末端加电感相当于在传输线末端延长了一段后末端短路,使得相位下降速率。幅度为0dB, 相位由。幅度为0dB, 相位由。

johnboat的专栏 1874

大数据量分页(海量数据分页)的高效实现

  海量数据分页,已经无法使用数据库自带的分页机制,比如MySQL 的 Limit ,这会导致严重的性能问题, 经过生产环境大数据量千万级数据量分页实现的 的总结,目前为止我 所使用 的大数据量分页机制 有 两条:   1. 如果表中存在 连续 的数字列并 为 索引,那么通过页码即可计算出此字段的范围,直接作范围查询即可: start = (page-1)*pagesize e...

老张的自言自语 4435

Android12 车载开发TaskView实现分屏

这里只给出TaskView的代码,相关联的源码,请看源码,如果想要使用TaskView需要自己去编译frameWork的源码,打包一个aar,或者jar出来使用,否则无法直接使用。1.如果分屏的应用如启动两个应用按照权重占比,互相不叠加在一起,点触摸击事件都可响应,例如左边启动QQ了,右边启动的是微信,二者窗口都可操作。TaskView是谷歌整合安卓多任务多窗口下交互重新重构的独立出来的module,本身继承自ServiceView,TaskView的相关概念性的东西参考。//创建的taskview。

android_bird_bird的博客 9552

MySQL性能调优与深度分页优化策略

在现代的Web应用和大数据环境中,MySQL作为一款广泛使用的开源关系数据库管理系统,其性能直接影响着应用程序的响应时间和用户体验。尤其是在面对海量数据的深度分页查询时,性能问题尤为突出。本文旨在探讨MySQL的性能调优策略以及深度分页查询的优化方法。MySQL性能调优是一个复杂的过程,涉及到数据库配置、查询优化、系统资源管理等多个方面。而深度分页查询的优化则需要结合具体的应用场景和数据特性,采用灵活的策略来实现高效的数据检索。通过上述的优化措施,可以显著提升MySQL在高并发和大数据环境下的表现。

小码农的博客 3857

linux和mac安装+配置circos(

一定要下载完这两个包,GD才会work,要不然会报错,且-modules显示也是fail。官网的教程说的很明白,但是很多包都已经过时了需要在网上找。一般来讲,所有包的安装都不会太困难,除了GD。1.是因为官网给的链接下出来的tgz无法解压。2.我的电脑安装后GD照样是fail的。,进入这个地址下一个.tgz。第二点的原因在于,官网的情况。,进入这个地址,按部就班。GD安装困难有以下几点。搞了一天终于配置成功。

xiufan1的博客 553

OpenCV入门(一)Python环境的搭建

因为有点Python基础,并且Python是比较好入门的编程语言,所以,机器视觉后面打算在Python这个平台下进行。

小幽余生不加糖 8123

mysql通用分页_MySQL海量数据的通用存储过程分页代码

本节主要内容:MySQL海量数据的通用存储过程分页代码本节为大家分享一例mysql 通用存储过程分页、海量数据分页的代码。1,测试用的表结构:复制代码 代码示例:CREATE TABLE IF NOT EXISTS `test` (`id` int(11) NOT NULL auto_increment,`sort` int(11)`title` varchar(50),PRIMARY KEY ...

weixin_28738173的博客 161

【26美赛E题 Passive Solar Shading】2026美赛数学建模(MCM/ICM)思路解析及代码分享

本文研究了被动太阳能遮阳(PSS)策略在建筑节能中的应用,针对Sungrove大学(低纬高温)和Borealis大学(高纬寒冷)两种典型气候条件,建立了动态太阳辐射-热平衡模型。通过优化遮阳结构(外檐长度、百叶角度)、窗户布局和内部热质量分布,实现了夏季制冷负荷降低30-40%(Sungrove)和冬季采暖负荷减少15-25%(Borealis)。创新性地采用全天候动态遮阳建模方法,结合热质量优化与储能设计,提出了可适应不同气候条件的建筑节能解决方案,为未来可持续建筑设计提供了量化框架。

一键难忘的博客 955

从传统到高效:深入解析数据库游标分页技术与实践

从传统到高效:深入解析数据库游标分页技术与实践

码农跟牛马有什么区别 1107

【LLM】大模型幻觉问题的原因和缓解方法

一、幻觉定义 备注(下面提及的两个名词): Faithfulness:是否遵循input content; Factualness:是否符合世界知识; 传统nlp任务重,幻觉大多数是faithfulness,比如Intrinsic Hallucination(冲突),摘要内容和document内容有冲突;再比如Extrinsic Hallucination(无中生有),生成内容中包含input要求的其他杂七杂八虚假信息;但LLM应该考虑的幻觉Factualness,因为数据源是Open-doman的世界知

发现问题,并解决问题,批判性思维 1万+

C++ PCL点云处理实战专栏

工业级点云处理技术学习资源,涵盖电力、建筑、隧道等领域的实战案例。内容分为三阶段:代码原理(算法认知)、动态库(项目验证)和完整代码(定制开发)。

weixin_45196569的博客 1121

MySQL分页查询深度剖析从LIMIT优化到海量数据处理实战

其次,可以考虑将查询分解:先通过一个子查询快速获取目标页的主键ID集合,再根据主键回表获取完整数据,即`SELECT FROM table_name WHERE id IN (SELECT id FROM table_name WHERE ... LIMIT ...)`。问题的核心在于,随着offset值的增大,MySQL需要扫描并丢弃前offset条记录,然后才返回需要的count条记录。在数据频繁变化的场景下,精确计算总记录数(如使用`COUNT()`)本身可能就是一个昂贵的操作,且总页数意义不大。

li504524452的博客 401

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

《深度剖析:MySQL、Oracle、SQL Server分页语法大揭秘》

在处理涉及多表关联、复杂条件筛选和数据聚合的分页查询时,Oracle的分页语法能够通过巧妙的子查询和逻辑组合,实现精准的数据筛选和分页展示。例如,在一个包含数百万条记录的数据库表中进行分页查询时,SQL Server能够利用其高效的索引机制和查询优化器,迅速返回所需的数据,为用户提供流畅的体验。在“书签分页”中,开发者通过记录上一页的最后一条数据的主键值,在下一页查询时,利用这个主键值来缩小查询范围,从而提高查询效率。这种分页方式直接明了,避免了使用子查询和复杂的计算,大大提高了查询的效率。

xy520521的博客 848

OV9734 DATASHEET,完整规格书

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

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

【实践指南】MyBatis Cursor流式查询:告别分页,高效处理海量数据

本文详细介绍了MyBatis Cursor流式查询技术,帮助开发者高效处理海量数据,避免传统分页查询的内存消耗和性能瓶颈。通过实际案例和代码示例,展示了Cursor在电商订单导出、实时数据同步等场景中的优势,包括内存优化、查询效率提升和代码简化。文章还提供了四种实现方式的对比和性能优化技巧,助力开发者掌握这一关键技术。

weixin_30265103的博客 439

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

上一篇: PostMan不香了,IDEA因为Apipost插件这一功能轻松取代
下一篇: 浅谈Java中的中文分词
智_永无止境
博客等级 码龄10年 803粉丝 406原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

智_永无止境

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

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

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

打赏作者

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

抵扣说明:

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

余额充值