Хочу сделать поиск пользователей на сайте и не знаю как лучше реализовать с одним запросом в базу или же с двумя. И в каком варианте будет быстрее работать если например будет 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(...)
Дважды гонять 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(...) |
Спасибо, так и сделаю
Спустя 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 пустое, то ненадо его в условие вообще записывать
и смое важное, это индексы на все поля посадить по которым будет происходить поиск или сортировка.
http://dev.mysql.com/doc/refman/5.0/en/inf...tion_found-rows .
что важно, это не вводить в запрос условия которые не нужны.
Если $GetFirstname пустое, то ненадо его в условие вообще записывать
и смое важное, это индексы на все поля посадить по которым будет происходить поиск или сортировка.