mysql - 优化sql查询分页

标签 mysql sql wordpress

我该怎么做才能使我的代码更快地进行分页。?
我尝试将其放入临时表中。 问题是创建临时表花了 4.56 秒。 wp_bp_xprofile_data 中的行数几乎只有 25k。我不知道为什么仅仅为了这个就需要很多时间。

另外我什么时候知道连接何时关闭。是每次页面刷新吗?

//
            //all variable are processed here....
            //

    $sql = "SELECT
          DN.User_ID,
          case when (FN.user_id is null or (length( trim( FN.meta_value )) = 0)) 
               and  (LN.user_id is null or (length( trim( LN.meta_value )) = 0)) then DN.value  
               else trim(concat( FN.meta_value, ' ', LN.meta_value )) end as Name,
          DN.Value DisplayName, 
          COALESCE( G.Value, '' ) Gender,
          COALESCE( BD.Value, '' ) Birthday,
          COALESCE( FLOOR( DATEDIFF( CURRENT_DATE, STR_TO_DATE( BD.value,'%m/%d/%Y'))/365), '' ) Age,
          COALESCE( P.Value, '' ) Phone,
          COALESCE( E.Value, '' ) Email,
          COALESCE( O.Value, '' ) Occupation, 
          COALESCE( R.Value, '' ) Region,
          COALESCE( PR.Value, '' ) Province,
          COALESCE( C.Value, '' ) City,
          COALESCE( CC.Value, '' ) CurrentCountry  
    FROM wp_bp_xprofile_data DN 
             LEFT JOIN wp_bp_xprofile_data G 
                ON DN.User_ID = G.User_ID AND G.field_id = 270 
             LEFT JOIN wp_bp_xprofile_data BD 
                ON DN.User_ID = BD.User_ID AND BD.field_id = 274 
             LEFT JOIN wp_bp_xprofile_data P 
                ON DN.User_ID = P.User_ID AND P.field_id = 275 
             LEFT JOIN wp_bp_xprofile_data E 
                ON DN.User_ID = E.User_ID AND E.field_id = 286 
             LEFT JOIN wp_bp_xprofile_data O 
                ON DN.User_ID = O.User_ID AND O.field_id = 71 
             LEFT JOIN wp_bp_xprofile_data CC
                ON DN.User_ID = CC.User_ID AND CC.field_id = 73 
             LEFT JOIN wp_bp_xprofile_data R
                ON DN.User_ID = R.User_ID AND R.field_id = 24 
             LEFT JOIN wp_bp_xprofile_data PR
                ON DN.User_ID = PR.User_ID AND PR.field_id = 355 
             LEFT JOIN wp_bp_xprofile_data C
                ON DN.User_ID = C.User_ID AND C.field_id = 354
             LEFT JOIN wp_usermeta FN
                ON DN.User_ID = FN.User_ID AND FN.meta_key = 'first_name'
             LEFT JOIN wp_usermeta LN
                ON DN.User_ID = LN.User_ID AND LN.meta_key = 'last_name'
    where DN.field_id = 1  ";

    if(!empty($_region))
    {
        $sql .= " AND R.User_ID IS NOT NULL AND R.Value = '".$_region."' ";
    }
    if(!empty($_province))
    {
        $sql .= " AND PR.User_ID IS NOT NULL AND PR.Value LIKE '".$_province."%' ";
    }
    if(!empty($_city))
    { 
        $sql .= " AND C.user_id IS NOT NULL AND C.Value LIKE '".$_city."%' ";
    }
    if(!empty($_ageMin) && !empty($_ageMax))
    {
        $sql .= " AND BD.User_ID IS NOT NULL AND FLOOR( DATEDIFF( CURRENT_DATE, STR_TO_DATE( BD.value,'%m/%d/%Y'))/365) BETWEEN   ".$_ageMin."  AND  ".$_ageMax;
    }
    if(!empty($_occupation))
    { 
        $sql .= " AND O.User_ID  IS NOT NULL AND O.Value = '".$_occupation."' ";
    }
    if(!empty($_gender))
    { 
        $sql .= " AND G.User_ID IS NOT NULL AND G.Value = '".$_gender."' ";
    } 
    if(!empty($_country))
    { 
        $sql .= " AND CC.User_ID IS NOT NULL AND CC.Value = '".$_country."' ";
    }  

    if(isset($search_val)){
        $sql .= "  
            AND
            (FN.meta_value LIKE '%".$search_val."%' OR  
            LN.meta_value LIKE '%".$search_val."%' OR 
            E.Value LIKE '%".$search_val."%' OR 
            O.Value LIKE '%".$search_val."%' OR 
            R.Value LIKE '%".$search_val."%' OR
            PR.Value LIKE '%".$search_val."%' OR
            C.Value LIKE '%".$search_val."%' OR
            CC.Value LIKE '%".$search_val."%')
        ";
    }

    $maxRow = $wpdb->getResults($sql);
    $limit = 30;
    $maxPage = ceil($maxRow/$limit); 

    if(!empty($page)){
        $start = ($limit * $page) - $limit; 
    }else{
        $start = 0; 
    }

    Generate_Pagination($maxRow);

    $sql .= " LIMIT ".$start." , ".$limit; 

    $datas = $wpdb->getResults($sql);

    foreach($data as $data){
        //output data;
    }
    ?>

使用解释

enter image description here

删除此代码时

FN.meta_value LIKE '%".$search_val."%' OR
LN.meta_value LIKE '%".$search_val."%' Or

会加快查询速度。 wp_usermeta 有 300k 行。 也有不同的 meta_key

wp_usermeta

     ` umeta_id | user_id | meta_key | meta_value`

最佳答案

尝试使用 SQL_CALC_FOUND_ROWS

    $sql = 'SELECT SQL_CALC_FOUND_ROWS ... LIMIT ' . $limit;

    $rows = $this->_db->fetchAll($sql);                                                                    
    $data = array(                                                                                         
        "total" => $this->_db->fetchOne('SELECT FOUND_ROWS()'),             
        "rows" => $rows                                                                                    
    );  

关于mysql - 优化sql查询分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20415738/

相关文章:

mysql - 更新程序 输入参数中的列不正确/未知

mysql - 如何在每个 XX :50 Seconds? 上安排一个 MySQL 事件

mysql - 电子邮件地址作为mysql中的选择索引以获得大表查询速度

sql - 阻止 SQL Server Management Studio 打破我的观点

sql - 在 Oracle 中选择具有最近日期和时间的记录

mysql - 为什么操作数应该只包含一列?

javascript - WordPress: fatal error :调用未定义的函数 wp_get_current_user()

wordpress - MVC3 + WordPress IIS Url 重写规则

CSS 工具提示不适用于 WordPress 页面

sql - 消除重复记录