[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: В каком варианте будет работать быстрее
Schurik
Всем привет.
Хочу сделать поиск пользователей на сайте и не знаю как лучше реализовать с одним запросом в базу или же с двумя. И в каком варианте будет быстрее работать если например будет 1000+++ пользователей.

Вариант с одним запросом
/* Пораметры поиска */
$GetFirstname = '';
$GetLastname = '';
$GetGender = '';
$GetCountry = '';

/* Запрос в базу */
$Query = mysql_query("SELECT id, login FROM Users WHERE
firstname LIKE '%
$GetFirstname%' AND lastname LIKE '%$GetLastname%' AND gender LIKE '%$GetGender%' AND country LIKE '%$GetCountry%'
ORDER BY id DESC"
);

$FoundUsers = mysql_num_rows($Query); /* Количество найденых пользователей */
$ShowUserNum = '20'; /* Количество пользователей на одной странице */
$TotalPages = ceil($FoundUsers/$ShowUserNum); /* Количество страниц */

$GetPage = '1'; /* страница по умолчанию */

if(isset($_GET['page'])){
$GetPage = intval($_GET['page']);
if($GetPage == '0' || $GetPage > $TotalPages){
$GetPage = '1';
}
}


if($FoundUsers != '0'){ /* если пользователи найдены */

$StPos = ($GetPage-1)*$ShowUserNum; /* Начальная позиция */
$FnPos = $StPos+$ShowUserNum; /* конечная позиция */

if($FnPos > $FoundUsers){ /* если конечная позиция больше общего количества пользователей */
$FnPos = $FoundUsers; /* то конечная позиция ровна общему количеству пользователей */
}

$User = array();
$ShowID = '0';

while($row = mysql_fetch_assoc($Query)){ /* Записываем найденых пользователей в массив */
if($ShowID >= $StPos && $ShowID < $FnPos){ /* Отбираем пользователей для текущей страницы */
$User[$ShowID] = array();
foreach ( $row as $field => $value ) {
$User[$ShowID][$field] = stripslashes($value);
}
}

$ShowID++;
}

$ShowID = $StPos;
$Result = '';

while($ShowID < $FnPos){
$Result .= "<div>".$User[$ShowID]['login']."</div>";
$ShowID++;
}

}
else {

$Result = 'Поиск не дал результатов';

}


или лучше с двумя запросами


select id from table where firstname like '%firstname%' .... - узнаем сколько всего пользователей
и
select id, login ... from table where firstname like '%firstname%' .... limit 0, 20 - и выводим пользователей для текущей страницы





Спустя 1 час, 48 минут, 22 секунды (18.09.2010 - 15:27) FatCat написал(а):
Второй вариант лучше, но его тоже можно оптимизировать.
Дважды гонять like '%firstname%' - это дважды одно действие.
На большой таблице даже SELECT COUNT(id) AS cid не даст существенного ускорения. Оптимальным будет в первом запросе собрать массив айдишников, а во втором запросе выбирать строки по айдишникам: WHERE id IN(...)

Спустя 31 минута, 25 секунд (18.09.2010 - 15:58) Schurik написал(а):
Цитата (FatCat @ 18.09.2010 - 12:27)
Второй вариант лучше, но его тоже можно оптимизировать.
Дважды гонять like '%firstname%' - это дважды одно действие.
На большой таблице даже SELECT COUNT(id) AS cid не даст существенного ускорения. Оптимальным будет в первом запросе собрать массив айдишников, а во втором запросе выбирать строки по айдишникам: WHERE id IN(...)

Спасибо, так и сделаю smile.gif

Спустя 6 часов, 44 минуты, 41 секунда (18.09.2010 - 22:43) SlavaFr написал(а):
@FatCat может оказатся, что прийдется все id с таблицы собирать, так что по моему лучше лишний раз count(*) запустить, или использовать SQL_CALC_FOUND_ROWS и FOUND_ROWS()
http://dev.mysql.com/doc/refman/5.0/en/inf...tion_found-rows .

что важно, это не вводить в запрос условия которые не нужны.
Если $GetFirstname пустое, то ненадо его в условие вообще записывать

и смое важное, это индексы на все поля посадить по которым будет происходить поиск или сортировка.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.