mysql优化limit分页

本文探讨了MySQL在处理大偏移量分页查询时的性能瓶颈,并提出了通过索引覆盖扫描和延迟关联优化查询效率的方法。同时介绍了如何使用书签替代偏移量,以减少不必要的数据扫描,提升查询性能。

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

系统需要进行分页操作时,通常会使用limit加上偏移量的方法实现,同时加上合适的order by子句,如果有对应的索引效率会不错。

但是一个常见令人头疼的问题就是当偏移量较大时,例如limit 10000,20这样的查询,这时MySQL需要查询10020条记录然后只返回最后20条,前面的10000条记录将被抛弃,代价较高。因此要么限制分页的数量,要么优化大偏移量的性能。

优化limit的方法:

1、尽可能的使用索引覆盖扫描或者适当的使用延迟关联来实现索引覆盖扫描。

例如:select film_id,film_name from film order by title limit 50,5;假设有索引(title,film_id)

可以将上述语句改为:

  select film_id,film_name from film film join(select film_id from film order by title limit 50,5) as lim on(lim.film_id=film.film_id);

这里使用延迟关联将大大提升查询效率,让MySQL扫描尽可能少的页面,获取需要访问的记录后再根据关联列回原表插叙需要的所有列。

2limitoffset的问题,其实是offset的问题,它会导致MySQL扫描大量不需要的行然后再抛弃掉。如果可以使用书签记录上次取数据的位置,那么下次就可以直接从该书签记录的位置开始扫描,这样就可以避免使用offset。当按`时间`翻页的时候, 由于已知记录中`时间`是也是递增的,所以可以用主键`id`当做书签。

例如第一次查询时:
select * from register order by re_dt desc limit 10;

由查询结果可以知道主键`id`,假设返回记录中最小主键`id`15460,则进行下一页查询的时候可以从15460开始查询,而不必使用offset

select * from register where id <15460 order by re_dt desc limit 10;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值