优化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

其他:

针对页面查询,也将尾页这种按钮直接去掉,只提供首页,上一页,下一页;

原文地址:https://www.cnblogs.com/tilamisu007/p/9018545.html