zoukankan      html  css  js  c++  java
  • 优化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

    其他:

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

  • 相关阅读:
    java--io流之转换流
    java--IO流之字节流、字符流
    java--递归
    java--IO流之File类
    java --JDBC
    2018-09-15JDBC事务详解1
    2018-09-10JSP内容和标签的查看权限+9个内置对象
    2018-09-12DBUtils工具包+DBCP连接池
    2018-09-08Cookie的发送和Cookie的读取+Session基本原理
    参考博客:URI和URL的区别
  • 原文地址:https://www.cnblogs.com/tilamisu007/p/9018545.html
Copyright © 2011-2022 走看看