如何解决Mysql深分页问题

文章讨论了在数据量较大但未达到大数据级别时,MySQL中深分页查询导致的性能下降问题。当使用limit进行大量偏移时,查询速度显著减慢。解决方案包括使用子查询优化和偏移法来提高查询效率。子查询通过先获取特定位置的id再进行限制,而偏移法则需要记录上次查询的id并按顺序检索。
摘要由CSDN通过智能技术生成

出现场景

在生产环境中一些数据量比较大的情况下,我们可能会遇到。

但是这个数据量也没有大到需要使用大数据的工具的地步,都是存在Mysql里面的。可能会有一些明细相关的查询。比如红包的领取情况之类的。那么可能会遇到深分页的问题。

深分页的定义

大家都写过分页查询,通过mysql的limit关键字,例如我要查第一页10条,那么就是limit 0,10。

这看起来没啥问题。

例如数据量很大,页数很多,我查第100000页的10条,那就是limit 100000,10。

你就会发现执行速度明显变慢,这就是深分页问题造成的。同样的查询数据量,深分页可能1s左右,但是你查最初的分页的时候,可能只需要几毫秒。

举例说明

select id, name from red_packet where create_time > '2022-06-13 00:00' limit 0,10;

select id, name from red_packet_detail where create_time > '2022-06-13 00:00' limit 100000, 10;

查询过程

  1. 假设我们的create_time是一个二级索引,我们先要找到所有满足记录的条件,拿到非聚集索引上面记录的主键id。

  2. 到聚集索引进行回表,查询数据。

  3. 扫描我们要查询的limit数据,从0开始不断扫描。最后抛弃前100000条。

原因

  1. limit要扫描1000010条数据,并且进行丢弃。
  2. 扫描更多数据也意味着回表的数据更多。

解决方案

子查询优化

select id, name FROM red_packet_detail where id >= (select a.id from red_packet_detail a where a.create_time >= '2022-06-13 00:00' limit 100000, 1) LIMIT 10;

偏移法(要知道上次查询的id,并且id自增)

select id, name FROM red_packet_detail where id > 10000 order by id limit 10;

参考资料【大厂面试题】如何解决Mysql深分页问题?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值