mysql优化limit分页

来源:互联网 发布:最新的搞笑网络短剧 编辑:程序博客网 时间:2024/05/16 15:16

系统需要进行分页操作时,通常会使用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;

0 0
原创粉丝点击