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 查询的时候,如果你的字段有索引的话,它是霍州索引的!
  • 相关阅读:
    (jmeter笔记)jmeter远程启用服务器(分布式)
    (jmeter笔记)jmeter打印日志
    (jmeter笔记)Jmeter正则表达式提取器获取Response hearders
    css3实现好看的边框效果
    简单递归写侧边菜单栏
    css3的transform-origin配合scale,控制动画,实现各种hover效果
    浅谈jQuery的promise
    tips07-encodeURI()的使用
    weui 的使用方法
    git 合并分支的时候会遇到的问题
  • 原文地址:https://www.cnblogs.com/jing1208/p/6293434.html
Copyright © 2011-2022 走看看