Что делать, чтобы сделать мой код быстрее для поискового вызова.?
Я попытался положить его в временную таблицу. Проблема: создание временной таблицы заняло 4,56 секунды. Количество строк в wp_bp_xprofile_data
составляет почти 25 тысяч. Я не знаю, почему для этого потребуется много времени.Оптимизировать sql-запрос для разбивки на страницы
Также, когда я знаю, когда соединение было закрыто. Это обновление каждой страницы?
//
//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;
}
?>
Использование Explain
При удалении этого кода
FN.meta_value LIKE '% "$ search_val." %' ИЛИ
LN.meta_value LIKE ' % ". $ search_val."% 'or
Ускорит запрос. wp_usermeta
имеет 300 тыс. Строк. также имеет различные meta_key
таблица wp_usermeta
` umeta_id | user_id | meta_key | meta_value`
можете ли вы объяснить причину этого запроса? –