千家信息网

MySQL中怎么实现分页查询

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这篇文章将为大家详细讲解有关MySQL中怎么实现分页查询,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。首先我们先创建一个订单表,只携带一个主键,其他全
千家信息网最后更新 2026年11月03日MySQL中怎么实现分页查询

这篇文章将为大家详细讲解有关MySQL中怎么实现分页查询,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

首先我们先创建一个订单表,只携带一个主键,其他全部字段都不携带索引。然后使用存储过程插入1000000条数据到数据表中:

说到分页呢?我们都知道使用limit关键字来进行分页,比如我们需要查询id为900000到900100的数据,我们可能会很熟练的这么进行分页:


可以看到我们直接使用limit查询id处于900000到900100范围的数据响应时间为3.51秒,如果再加上业务处理逻辑的操作时间,基本上整个分页查询操作得耗时4秒以上,我们可以使用explain关键字查看刚才这个sql语句的运行属性:

可以看到我们实际上查询只需要100行数据,但是数据库会从第一行开始扫描,一直扫描到我们需要的数据才会停下来。在一个系统中每次查询都扫描几十万行数据,肯定性能大打折扣,因为前面900000行数据对我们来说是无效数据,所以我们首先可以先使用子查询来优化,先使用子查询实现覆盖索引查询返回主键id,再使用主键id和原表做一个关联操作,可以减少回表次数并且减少Mysql扫描那些无效的行数:


我多次测试发现使用子查询优化后,想用的查询结果只需要0.58秒左右。为什么使用子查询能提供这么高的效率呢?因为我们数据表有20多个字段,我们子查询使用select id效率在大数据的情况下大概是select *的3倍性能,而且id是主键可以利用索引优化查询速度,然后外层的查询利用id也可以使用索引加快查询效率,所以显而易见使用子查询进行分页效率比直接使用limit分页效率高很多。

那既然可以利用id主键的性质来提升效率,其实我们可以进一步去掉子查询利用id区间范围去查询数据:


可以看到利用between...and将id局限在指定范围查询分页只需要0.06秒,为什么会这么快呢,我们可以利用explain测试一下运行属性:

可以看到只扫描了100行数据,所以效率自然而然提高了。但是id限制查询都存在一个条件:就是你数据库数据必须按照id连续并且不能中断,这是为什么呢?其实很好理解,数据库比如有100条数据分别id为1---100,如果我要查询第50--60条的数据,我可以使用下列sql语句:
select * from aok_score_info where id between 50 and 60 limit 10;

但是如果中间有一部分无效数据,我需要删除,我将id为30--40的数据删除,这时候我要查询第50--60条的数据,如果还使用上面的sql语句,查出来的一样是id为50--60的数据,但是实际上数据库第50--60条的数据应该id为60--70.所以说id限制分页查询效率很高但是有局限性,局限性就在于不能删除数据以保证id的连续性,而子查询不能使用where子句,因为使用where子句会筛选条件会导致id失去连续性。所以在id能保证连续性的情况下我们可以选择使用限制id的方法提高分页效率。接下来我们看下如果id无法保证绝对连续除了子查询还能如何处理。

首先我们还是以刚才这100万条数据来测试,id目前是连续的从1--100000,我们现在使用inner join在子查询中只查询索引列id,然后通过id去读取需要的列:

可以看到只需要0.735秒,但是很明显我们现在id是连续的。我们现在删除id为10001--13000的3000条数据,然后再测试:

很明显我们可以看到查询出的记录顺延了3000条,也就可以表示我们在id不连续的时候可以使用只读索引方法来优化limit语句,可以大幅度提高分页的效率。而我开发中经常使用一种方法:客户端传id和size表示当前页数id最大值以及每页条数,然后直接使用id查询顺推的size条数据,举个例子比如我们第八页返回id为701--800的数据,然后查询第九页时只需要将第七页最大id800传过来,就可以顺推得到接下来100条数据:

比如客户端查询第一页,id传0,则后端可以使用下列sql语句:

select * from aok_score_info limit 0, 10;

由于查询时第一页的数据,所以扫描速度很快,之后页数查询传当前页数id最大值,比如传参id为9999,表示上一页的最大id为9999,那么我们就从9999开始顺推查询,可以看到中间删掉的3000条记录都会直接跳过,所以不会影响我们查询的正确性,最关键的是id是主键上面有索引,这个sql语句执行时间0.04秒,可以说在高并发的情况下也基本可以满足要求了。这是我个人开发中所理解的几种分页的方案,有不同见解的可以提出来一起讨论讨论。

关于MySQL中怎么实现分页查询就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

查询 数据 效率 索引 语句 最大 数据库 测试 关键 情况 方法 时间 范围 连续性 页数 顺推 保证 限制 明显 接下来 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 上海挚品互联网科技有限公司 哈尔滨大商圈互联网科技有限公司 互联网金融 科技 互联网金融 金融科技 互联网科技公司电话 互联网科技ppt模板 四川狮子座互联网科技 海南购全球互联网科技 中国最先进互联网科技公司 互联网 科技馆 北京华百购互联网科技有限公司 科技互联网大厂 燊美集互联网科技有限公司 国大互联网教育科技有限公司薪资 上海创道互联网络科技有限公司 互联网科技职业技能培训学校 唐山双旺合互联网科技产业园 安徽零酒互联网科技有限公司 科技互联网专业工作会议发言稿 互联网科技创新方面的资料 美国互联网科技巨头监管 喔噻互联网科技 互联网科技论文 美国互联网黑科技 人人互联网科技是培训 成都玖崟互联网科技有限公司乐商圈怎么样 新华互联网科技2019 互联网在线教育科技创业 山东子淼互联网科技有限公司 互联网科技融合创新
0