zoukankan      html  css  js  c++  java
  • MYSQL分页优化

    /*
     * 当数据有50W条的时候,每页有10条数据,
     * 用普通的分页的时候,跳转到最后一页,sql语句的执行时间须要900ms左右
     * */
    //sql语句为:
    select id,companyname,contactname,contactmobile,genjintime from crm_customer order by id desc limit 0, 20
    
    /*
     * 当数据有50W条的时候,每页有10条数据,
     * 用这种分页的时候,每一次跳转,sql语句的执行时间仅需1ms左右,不管是往最后一页跳
     * */
    //查询上一页的sql语句为:
    select id,companyname,contactname,contactmobile,genjintime from crm_customer where id < $id order by id desc limit 10
    
    if($_GET['prev']) {
      $sql = "select id,companyname,contactname,contactmobile,genjintime from crm_customer where id < ".$_GET['prev']." order by id desc limit 10";
    } else if($_GET['next']) {
      $sql = "select id,companyname,contactname,contactmobile,genjintime from crm_customer where id > ".$_GET['next']." order by id asc limit 10";
    } else {
      $sql = "select id,companyname,contactname,contactmobile,genjintime from crm_customer order by id asc limit 10";
    }*/
    $customer = M('customer')->query($sql);
    if($_GET['prev']) {
      sort($customer);
    }
    $show = '';
    if($customer['0']['id']){
      $show .= '<a href="/index.php/Home/Page/HighlyPage/prev/'.$customer['0']['id'].'">上一页</a>';
    }
    if($customer['0']['id']){
      $show .= '<a href="/index.php/Home/Page/HighlyPage/next/'.$customer['9']['id'].'">下一页</a>';
    }
    
    注:但是这种分页有个缺点只能有上一页,下一页,不能提供更复杂的跳转到某一页的链接
    
    /*
     * <上一页 1 2 3 4 5 6 7 8 9 下一页>”这样的链接方式    -----如果要这种的链接方式的话-----
     * 如果LIMIT m,n不可避免的话,要优化效率,只有尽可能的让m小一下,我们扩展前面做法,还是SELECT * FROM `table` ORDER BY id DESC,
     * 按id降序分页,每页20条,当前是第10页,当前页条目id最大的是9527,最小的是9500,比如要跳到第8页,我看的SQL语句可以这样写:
     *   SELECT * FROM `table` WHERE id < 9500 ORDER BY id ASC LIMIT 2,20;
     * 跳转到第13页:
     *   SELECT * FROM `table` WHERE id > 9527 ORDER BY id DESC LIMIT 3,20;
     * */

    思路二:

    1、简单来说,对于分页的优化就是。。。避免数据量大时扫描过多的记录。
    如果,有条件搜索的话,该怎么办呢,这个时候,我们要知道在用limit 的时候,如果对于有where 条件,又想走索引用limit的,必须设计一个索引,将where 放第一位,limit用到的主键放第2位,而且只能select 主键!
    
    2、这时候,我们可以分两次来查询,
         第一次:先根据条件查出主键id,(把where条件中的字段加上索引),此时,再把id拼接成字符串的形式,再次执行sql查询
         第二次:SELECT * FROM `table` WHERE id in (1,2,3,4,5,6,7,8,9);  //这样的形式   用in 查询的时候,如果你的字段有索引的话,它是霍州索引的!
  • 相关阅读:
    linux 创建python虚拟环境
    dic1.update(dic2)和{**dic2, **dic1}的区别
    redis
    电脑开机一卡一卡的,重启就好了
    股东大会和董事会的区别
    word空白框打钩
    计划资产回报
    成本法为什么要转权益法
    租赁负债
    AIDA64序列号
  • 原文地址:https://www.cnblogs.com/jing1208/p/6293434.html
Copyright © 2011-2022 走看看