MySQL的limit使用及解决超大分页问题

本文探讨了SQL的limit语法,特别是其性能差异,随着offset增大查询耗时增加的原因,并提供了用id和覆盖索引优化的策略。通过实例和性能对比,强调了在实际项目中的优化技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

limit语法

limit语法支持两个参数,offset和limit,前者表示偏移量,后者表示取前limit条数据.

例如:
返回符合条件的前10条语句
select * from user limit 10
返回符合条件的第11-20条数据
select * from user limit 10,20

复制代码从上面也可以看出来,limit n 等价于limit 0,n.

性能分析

select * from user limit 0,100 ---------耗时0.03s
select * from user limit 10000,100 ---------耗时0.05s
select * from user limit 100000,100 ---------耗时0.13s
select * from user limit 500000,100 ---------耗时0.23s
select * from user limit 1000000,100 ---------耗时0.50s
select * from user limit 1800000,100 ---------耗时0.98s

可以看到随着offset的增大,性能越来越差.

这是为什么呢?因为limit 10000,10的语法实际上是mysql查找到前10010条数据,之后丢弃前面的10000行,这个步骤其实是浪费掉的.

优化

1. 用id优化

先找到上次分页的最大ID,然后利用id上的索引来查询,类似于

select * from user where id>1000000 limit 100.

2.用覆盖索引优化

mysql的查询完全命中索引的时候,称为覆盖索引,是非常快的,因为查询只需要在索引上进行查找,之后可以直接返回,而不用再回数据表拿数据.因此我们可以先查出索引的ID,然后根据Id拿数据.

select * from (select id from job limit 1000000,100) a left join job b on a.id = b.id;

原文链接:https://juejin.cn/post/6844903981970358286

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值