一站式解决mysql深分页问题

 更新时间:2026年02月28日 10:25:25   作者:想用offer打牌  
在后端开发或者面试中,常常会遇到深分页的问题,深分页问题会导致用户体验急剧下降,甚至造成服务器崩溃,下面就来介绍一下该问题的解决,感兴趣的可以了解一下

引言

在后端开发或者面试中,常常会遇到深分页的问题。在处理电商平台海量商品数据、社交媒体时间线等场景时,深分页问题会导致用户体验急剧下降,甚至造成服务器崩溃。接下来让我们解析一下深分页问题。

什么是深分页问题😪

例如前端要求返回指定第1000000行到第1000000 + 10行数据,我们常常会写出这样的SQL语句。

select * from user order by id limit 1000000, 10;

这种limit的offset,size中的offset如果很小则没有问题,一旦变得很大,那么查询的时间就会很长,接口响应时间也会变得很慢,严重影响用户使用体验。

为什么offset一旦变得很大,sql执行速度就会变得很慢呢?这是和MySQL的执行流程有关的,以上面的SQL语句为例子,当你执行这条SQL语句时,MySQL的server层会调用存储引擎获取到从0到1000000 + 10条数据,然后将前1000000数据抛弃,留下剩下的10条数据包装成结果集返回。获取这些多余数据耗费的时间非常大,所以SQL查询速度相应的也会变慢了,这就是深分页带来的问题。

解决深分页问题🥱

1.优化SQL语句(必做)

select * from user order by id limit 1000000, 10;

还是以这条SQL语句为例子,去除深分页问题不谈,这样SQL语句本身执行效率就不够高,至少要进行以下的优化:

  1. 避免使用select *语句,前端需要什么内容就查询什么字段,使用select *语句执行效率过慢。
  2. 确保查询的字段带有合适的索引,结合实际情况,为查询字段建立合适的索引,例如唯一索引,联合索引等
  3. 使用合适的where条件进行过滤

2.子查询优化

在第一个优化的基础上,我们可以选用子查询来进行优化,见以下SQL语句为例:

select (字段) from user where id >= (select id from user order by id limit 1000000, 1) order by id limit 10

通过子查询查询单id字段,查询到前1000000 + 1条数据,然后丢弃前1000000数据,留下最后一条数据。因为这里只查询单个id字段数据,时间效率可以提升。如果有合适的where条件进行过滤,则可以起到覆盖索引的效果,可以进一步提高时间查询效率。

查到了一条id之后,存储引擎根据条件,就再走一遍主键索引(在为id加上了主键索引的前提下),然后向后取后十条字段数据就完成了该SQL语句执行。这种优化可以提高时间效率1.5倍左右。

3.游标分页法优化

  • 实现步骤

    1. 首次查询时,获取第一页数据,并返回一个游标。
    2. 后续查询使用该游标来获取下一页数据。
  • 优点:避免了偏移量带来的性能问题。

  • 缺点:依赖稳定的排序,不适合随机访问页码。

SELECT id,name FROM user WHERE sex = 'male' AND id > 10 LIMIT 10;

在上面的SQL语句中id > 10,这个10就是上一页的查询内容id,可以借助它再查询下一页,这样就可以避免一时间要查询大量数据而导致的时间效率低下的弊端,查询速度非常稳定,但适用场景有限,可以用作瀑布流,例如抖音,头条新闻等。

闲谈😊

其实深分页问题只能缓解,没有根治之法。如果你去浏览器进行查询,最多给你展示的也就几百页,不会到万的这个级别,用户一般也不会去翻到最后一页去查看感兴趣的内容,所以如果有人给你提出了这个需求,你需要和他反馈一下这个需求是否合理,可不可以改成其他相同效果的需求,例如不用直接跳转的,只有上一页,下一页这样的效果,这样用户体验也不错,服务器的压力也会变小。

在实际应用中,需要根据具体场景选择合适的解决方案,并与前端和产品团队充分沟通,找到最佳实践。

总结❤️

到此这篇关于一站式解决mysql深分页问题的文章就介绍到这了,更多相关mysql深分页内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySql数据库CRUD(增删改查)操作全流程

    MySql数据库CRUD(增删改查)操作全流程

    CRUD是数据库操作的核心,对应Create(新增)、Read(查询)、Update(修改)、Delete(删除)四种基础操作,这篇文章主要介绍了MySql数据库CRUD(增删改查)操作的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2026-01-01
  • mysql中ROW_FORMAT的选择问题

    mysql中ROW_FORMAT的选择问题

    这篇文章主要介绍了mysql中ROW_FORMAT的选择问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-10-10
  • mysql是否需要容器化深入分析

    mysql是否需要容器化深入分析

    这篇文章主要为大家介绍了mysql是否需要容器化深入解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • Mysql中索引和约束的示例语句

    Mysql中索引和约束的示例语句

    这篇文章主要介绍了Mysql中索引和约束的相关资料,帮助大家更好的理解和使用MySQL,感兴趣的朋友可以了解下
    2021-01-01
  • MySql中如何使用 explain 查询 SQL 的执行计划

    MySql中如何使用 explain 查询 SQL 的执行计划

    explain命令是查看查询优化器如何决定执行查询的主要方法。这篇文章重点给大家介绍MySql中如何使用 explain 查询 SQL 的执行计划,感兴趣的朋友一起看看吧
    2018-05-05
  • 很全面的MySQL处理重复数据代码

    很全面的MySQL处理重复数据代码

    这篇文章主要为大家详细介绍了MySQL处理重复数据的实现代码,如何防止数据表出现重复数据及如何删除数据表中的重复数据,感兴趣的小伙伴们可以参考一下
    2016-05-05
  • 部署MySQL8.0环境全过程

    部署MySQL8.0环境全过程

    本文详细介绍了如何下载、安装和配置MySQL 8.0,包括选择合适的安装文件、安装过程中的各种选项和配置步骤,以及配置MySQL环境变量以便在命令行中使用MySQL命令
    2025-10-10
  • MySql 设置表格字段key中的值

    MySql 设置表格字段key中的值

    本文主要介绍了MySql 设置表格字段key中的值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-05-05
  • 新手学习MySQL索引

    新手学习MySQL索引

    如果正确合理设计并且使用索引的MySQL是一辆兰博基尼的话,那么没有索引的MySQL就是一个人力三轮车。通常大型网站单日就可能会产生几十万甚至几百万的数据,没有索引查询会变的非常缓慢,下面小编来带大家了解下索引
    2019-05-05
  • MySQL中CURRENT_TIMESTAMP时间戳的使用详解

    MySQL中CURRENT_TIMESTAMP时间戳的使用详解

    这篇文章主要给大家介绍了关于MySQL中CURRENT_TIMESTAMP时间戳的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2022-03-03

最新评论