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

    其他:

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

  • 相关阅读:
    ZooKeeper学习第一期---Zookeeper简单介绍
    安装zookeeper(单机,伪集群)
    一张图看懂DNS域名解析全过程
    CDN基本工作过程
    第十七章、程序管理与 SELinux 初探
    直方图均衡化的缺点——不平坦
    电感耦合等离子体质谱法响应时间
    C++内容记录
    图像质量评价-NQM和WPSNR
    分颜色通道SR的相关论文
  • 原文地址:https://www.cnblogs.com/tilamisu007/p/9018545.html
Copyright © 2020-2023  润新知