mysql深度分页的问题解决

 更新时间:2025年07月29日 09:31:26   作者:想养一只萨摩耶~  
本文主要介绍了mysql深度分页的问题解决,解决方案包括子查询、INNER JOIN延迟关联及标签记录法,通过减少回表次数或避免重复扫描提升查询效率,下面就一起来了解一下

limit深分页为什么会变慢?

例如:一条sql:

select id,name,age, from user where age >10 limit (10000,10);

首先这条sql肯定是比较慢的,因为它经过了很多次的回表。

sql执行流程:

1:先通过普通索引age,过滤掉age条件,找到符合条件的这10010条记录的id

2:通过这10010条记录的id找到id的叶子结点,取出对应的值(回表)

3:丢弃前10000条数据,留下最后10条,返回。

sql变慢的原因:

  1. limit语句会先扫描offset+n行,然后再丢弃掉前offset行,返回后n行数据。也就是说limit 100000,10,就会扫描100010行,而limit 0,10,只扫描10行。
  2. limit 100000,10 扫描更多的行数,也意味着回表更多的次数。

解决方案一:通过子查询优化

因为上面的sql,回表了100010次,但其实回表10次就够了,所以说只需要减少回表次数就够了。

到这个时候有些同学可能对于回表这个概念并不是很清楚,简单来说:从二级索引的叶子结点上只能查询到当前索引字段和id字段,然后根据查询到的id字段再去主键索引中查询(因为主键索引的叶子结点中存放的是整行数据)

那么看到这可能很多人就明白了,只需要将条件转移到主键索引树上就能够减少回表次数了。

所以我们只需要写一个子查询将id查询出来,然后将这个id作为主查询的where条件就ok了。

注意:子查询也不能过多的回表。

select id,sales_order_code,lift_code from `or_lift_item` where id > (select id FROM or_lift_item WHERE create_time> '2023-06-03 10:25:51' limit 50000,1) LIMIT 10

这个查询效果是一样的,但是回表次数却减少到了10条,查询效率大大提高。

解决方案二: INNER JOIN 延迟关联

延迟关联的优化思路,跟子查询的优化思路其实是一样的:都是把条件转移到主键索引树,然后减少回表。不同点是,延迟关联使用了inner join代替子查询。

优化后的SQL如下:

select abc.id,abc.sales_order_code,abc.lift_code from `or_lift_item` abc JOIN (select a.id FROM or_lift_item a WHERE a.create_time> '2023-06-03 10:25:51' ORDER BY a.create_time limit 40000,10) tbs ON abc.id = tbs.id

解决方案三: 标签记录法

limit 深分页问题的本质原因就是:偏移量(offset)越大,mysql就会扫描越多的行,然后再抛弃掉。这样就导致查询性能的下降。

其实我们可以采用标签记录法,就是标记一下上次查询到哪一条了,下次再来查的时候,从该条开始往下扫描。就好像看书一样,上次看到哪里了,你就折叠一下或者夹个书签,下次来看的时候,直接就翻到啦。

假设上一次记录到100000,则SQL可以修改为:

select id,sales_order_code,lift_code from `or_lift_item` where id > 100000 ORDER BY id LIMIT 10

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

相关文章

  • MySQL锁(表锁,行锁,共享锁,排它锁,间隙锁)使用详解

    MySQL锁(表锁,行锁,共享锁,排它锁,间隙锁)使用详解

    本文全面讲解了MySQL中锁包括表锁,行锁,共享锁,排它锁,间隙锁的详细使用方法
    2018-10-10
  • MySQL性能优化的一些技巧帮助你的数据库

    MySQL性能优化的一些技巧帮助你的数据库

    你完成了你的品牌新的应用程序,一切工作就像一个魅力;突然间,一个大爆发的用户你的MySQL服务器,您的网站已关闭,是什么问题导致的呢?以下是MySQL性能优化的一些技巧,将帮助你,帮助你的数据库
    2013-01-01
  • MySQL 查看事务和锁情况的常用语句分享

    MySQL 查看事务和锁情况的常用语句分享

    这篇文章主要介绍了MySQL 查看事务和锁情况的常用语句分享,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • MySQL中的ORDER BY问题

    MySQL中的ORDER BY问题

    这篇文章主要介绍了MySQL中的ORDER BY问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • MySQL 实现数据分片进行数据查询的方案

    MySQL 实现数据分片进行数据查询的方案

    本文介绍MySQL数据分片技术,包括垂直分片和水平分片,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-08-08
  • MySQL OOM 系列三 摆脱MySQL被Kill的厄运

    MySQL OOM 系列三 摆脱MySQL被Kill的厄运

    这篇文章主要介绍了MySQL OOM 系列三 摆脱MySQL被Kill的厄运 ,需要的朋友可以参考下
    2016-07-07
  • 详解MySQL主从复制实战 - 基于日志点的复制

    详解MySQL主从复制实战 - 基于日志点的复制

    这篇文章主要介绍了详解MySQL主从复制实战 - 基于日志点的复制,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-03-03
  • 深入浅析Mysql联合索引最左匹配原则

    深入浅析Mysql联合索引最左匹配原则

    这篇文章主要介绍了Mysql联合索引最左匹配原则,使用联合索引的好处多多,具体内容详情大家跟随脚本之家小编一起学习吧
    2018-06-06
  • MySQL复制表常用的四种方式小结

    MySQL复制表常用的四种方式小结

    mysql 想必大家比较熟悉了,我们常见的crud  sql想必大家也是手到拈来,但可能会有人不会写mysql中复制表,所以接下来本文我会介绍四种常用的复制表的方式,需要的朋友可以参考下
    2023-07-07
  • MySQL数据库管理常用命令小结

    MySQL数据库管理常用命令小结

    MySQL数据库是一种开放源代码的关系型数据库管理系统,MySQL数据库系统使用最常用的数据库管理语言--结构化查询语言(SQL)进行数据库管理,MySQL数据库管理有它自己独特的使用命令,下面为您介绍MySQL数据库管理常用命令。
    2011-03-03

最新评论