zoukankan      html  css  js  c++  java
  • mysql大量数据分页查询优化-延迟关联

    所有的php初学者都应该知道,mysql的分页语句写法如下:

    1
    select from a limit (page-1)*page_size,page_size

    而当这语句分页到一定程度时,例如1000页,每页20条

    1
    select from a limit 19980,20

    会发现分页之后查询的会越来越慢

    原因是因为limit a,b 的取数据方式是,先取出a+b条数据,再把a条筛选掉,剩b条,相当于一次性要取a+b条的数据,而a条其实是无用的

    解决方案如下

    一:php代码解决

    例如我们先查询出第一页的数据:

    1
    select from a limit 20

    保留最后一个的id,当需要取第2页数据时,则

    1
    select from where id>最后一个的id limit 20

    这样数据库就会每次都能走索引,然后只查出20条

    缺点:不能从第一页跳转到第n页

    缺点解决方案:前100页,不做优化,当到101页时采用该优化方案,并且不让用户从101页进行页面跳转到1xx页

    二:mysql解决

    1
    2
    3
    4
    5
    6
    7
    SELECT *
            FROM a
            inner join
            select id 
            from a
            LIMIT 19980, 20 
        as lim using(id);

    使用该方法,会先从索引表取出索引id,然后进行using索引覆盖方法,因为先查询的是索引,然后才从索引里关联取出20条记录,大大的提升了查询速度

    实例图:

    仙士可博客

    普通方法查询,0.123秒

    上一页最后一个的id为20000,则

    仙士可博客 php方法查询,0.070秒

    仙士可博客

    mysql索引覆盖查询,0.089秒

     

  • 相关阅读:
    jQuery禁用或启用
    ASP.NET MVC一次删除多笔记录
    在你的ASP.NET MVC中使用查找功能
    Get radio selected value
    绑定一个值给radio
    ASP.NET MVC实现权限控制
    为Guid数据类型的属性(property)赋值
    Razor语法中绑定一个值给checkbox
    判断IEnumerable<T>集合中是否包含有T对象
    SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM.
  • 原文地址:https://www.cnblogs.com/myJuly/p/12987311.html
Copyright © 2011-2022 走看看