优化limit分页
问题:
订单数据大约90万+,每页展示20条记录,当直接点击尾页时,调用服务超时;
sql如下:select * from t_order_salary where create_time<'2018-05-10 00:00:00' order by create_time limit 900000,20;
limit 900000,20;,mysql需要查询前900020条记录然后返回最后20条,前面900000条记录将被抛弃,
一言以蔽之,就是越往后分页, LIMIT 语句的偏移量就会越大,速度也会明显变慢。
优化方案:
1、JOIN 分页方式
使用覆盖索引,延迟关联大大提升查询效率
select a.* from t_order_salary a
join (
select id from t_ordersalary where create_time<'2018-05-10 00:00:00' order by create_time limit 900000,20
) b on a.id =b.id;
2、子查询方式
select * from t_order_salary
where create_time<(
select create_time from t_order_salary where create_time<'2018-05-10 00:00:00' order by create_time limit 900000,1
) limit 20;
为什么会这样呢?因为子查询是在索引上完成的,而普通的查询时在数据文件上完成的,通常来说,索引文件要比数据文件小得多,所以操作起来也会更有效率。
3、折半+反序查询
当查询的页数超过数据的一半的时候,将数据倒序,再查询,这样有可能造成一定的误差;
4、当更改sql仍然满足不了的情况,可以考虑使用分库分表+ES
其他:
针对页面查询,也将尾页这种按钮直接去掉,只提供首页,上一页,下一页;