Подскажите мне пожалуйста, как правильно оптимизировать следующую ситуацию:
//Есть запрос формирующий список пользователей, пример запроса(на самом деле он меняется в зависимости от условий)
$result=mssql_query("SELECT id FROM dbo.users WHERE field='".@$field."' ");
//этот список запоминаю в сессию
while( $row=mssql_fetch_array($result) )
{
$_SESSION['rr']=$row['id'];
}
//разного рода сортировки, с обновлением страницы...
//далее идет вывод информации о всех пользователях
$mm=$_SESSION['rr'];
foreach($mm as $key=>$user_id)
{
//извлекаем информацию о пользователе
$results=mssql_query("SELECT name, lastname FROM dbo.info WHERE id_user='".@$user_id."' ");
list($name, $lastname)=mssql_fetch_array($results);
//извлекаем дополнительную информацию о пользователе
$results=mssql_query("SELECT date1, work FROM dbo.info_work WHERE id_user='".@$user_id."' ");
list($date1, $work)=mssql_fetch_array($results);
//print "пользователь:".$name." ".$lastname;
//...
}
запросов в цикле около 10, и время на их выполнение : 0.09 сек
если пользователей 10, то не заметно, а если 100 - то страничка грузится 9 секунд.
Как правильно организовать вывод, чтоб не было потерь во времени?
Спустя 1 час, 22 минуты, 54 секунды (22.11.2010 - 09:19) linker написал(а):
Может сразу первым запросом все и вытянуть? И сохранять не в сессию, а в memcache?
SELECT `u`.`id`, `i`.`name`, `i`.`lastname`, `iw`.`datel`, `iw`.`work` FROM `dbo`.`users` AS `u`Вообще неплохо было бы объединить две таблицы `users` и `info` в одну таблицу `users`, тут жесткая связь 1 к 1, а значит нет смысла хранить эти данные относящиеся к одной сущности в разных таблицах. А так же подумать на счет `info_work`, как тут связь?
LEFT JOIN `dbo`.`info` as `i` ON `i`.`id_user` = `u`.`id`
LEFT JOIN `dbo`.`info_work` as `iw` ON `iw`.`id_user` = `u`.`id`
WHERE `u`.`field` = '" . @$field
Спустя 8 минут, 43 секунды (22.11.2010 - 09:28) zvezda_t написал(а):
linker, спасибо за предложение! Я подумаю как перестроить бд)
Еще такая мысль у меня появилась:
перед циклом вызвать представление(объединить в него все запросы из цикла), и передать в него массив айдишников пользователя, данные полученные из представления записать в массивы и уже эти массивы в цикле выводить на печать))
насколько это правильно?
Еще такая мысль у меня появилась:
перед циклом вызвать представление(объединить в него все запросы из цикла), и передать в него массив айдишников пользователя, данные полученные из представления записать в массивы и уже эти массивы в цикле выводить на печать))
насколько это правильно?

Спустя 3 минуты, 19 секунд (22.11.2010 - 09:31) linker написал(а):
А вьюхи разве могут "иметь" несколько запросов?
Спустя 23 минуты (22.11.2010 - 09:54) zvezda_t написал(а):
Цитата |
А вьюхи разве могут "иметь" несколько запросов? |
Я так представляю:
dbo.View_user
SELECT `u`.`id`, `i`.`name`, `i`.`lastname`, `iw`.`datel`, `iw`.`work` FROM `dbo`.`users` AS `u`
LEFT JOIN `dbo`.`info` as `i` ON `i`.`id_user` = `u`.`id`
LEFT JOIN `dbo`.`info_work` as `iw` ON `iw`.`id_user` = `u`.`id`
//Есть запрос формирующий список пользователей
$result=mssql_query("SELECT id FROM dbo.users WHERE field='".@$field."' ");
//этот список запоминаю в сессию
while( $row=mssql_fetch_array($result) )
{
$_SESSION['rr']=$row['id'];
}
//разного рода сортировки, с обновлением страницы...
//далее идет вывод информации о всех пользователях
$mm=$_SESSION['rr'];
//----------------1------------------------
foreach($mm as $key=>$user_id)
{
$result=mssql_query("SELECT * FROM dbo.View_user WHERE id=".$user_id."");
$row=mssql_fetch_array($result);
//print "пользователь:".$row['name']." ".$row['lastname'];
//...
}
//------------------2------------------------
//или так, но не совсем понятно как сделать:
$result=mssql_query("SELECT * FROM dbo.View_user WHERE id=???");//тут не знаю как массив передать
while( $row=mssql_fetch_array($result) )
{
//print "пользователь:".$row['name']." ".$row['lastname'];
//...
}
Спустя 3 минуты, 14 секунд (22.11.2010 - 09:57) zvezda_t написал(а):
Цитата |
Может сразу первым запросом все и вытянуть? |
дело в том что сам первый запрос - он тоже меняется постоянно - он в другом месте формируется
Спустя 8 минут, 25 секунд (22.11.2010 - 10:06) kirik написал(а):
Цитата (linker @ 22.11.2010 - 01:19) |
И сохранять не в сессию, а в memcache? |
мемкэш на винде не самое хорошее решение..
Спустя 20 минут, 13 секунд (22.11.2010 - 10:26) linker написал(а):
Нормальное, у меня работает и не парюсь. Тем более не обязательно его иметь на той же машине, что и веб-сервер с пыхом.
Спустя 4 минуты, 49 секунд (22.11.2010 - 10:31) linker написал(а):
С вьюхами я не знай как, но вот как вариант
$result=mssql_query("SELECT id FROM dbo.users WHERE field='".@$field."' ");А базу я бы нормализовал таки и было бы еще лучше.
...
$res = mysql_query("SELECT `i`.`name`, `i`.`lastname`, `iw`.`datel`, `iw`.`work` FROM `dbo`.`info` AS `i`
LEFT JOIN `dbo`.`info_work` as `iw` ON `iw`.`id_user` = `i`.`id`
WHERE `i`.`id_user` IN (" . implode(",", $_SESSION['rr']) . ")");
Спустя 12 минут, 39 секунд (22.11.2010 - 10:44) zvezda_t написал(а):
linker
ух ты здорово!)))
Буду делать так! благодарю))) теперь понятно
ух ты здорово!)))
Буду делать так! благодарю))) теперь понятно



Спустя 3 часа, 49 минут, 41 секунда (22.11.2010 - 14:33) SlavaFr написал(а):
Цитата (zvezda_t @ 22.11.2010 - 06:28) |
linker, спасибо за предложение! Я подумаю как перестроить бд) Еще такая мысль у меня появилась: перед циклом вызвать представление(объединить в него все запросы из цикла), и передать в него массив айдишников пользователя, данные полученные из представления записать в массивы и уже эти массивы в цикле выводить на печать)) насколько это правильно? :rolleyes: |
a зачем? какая для этого причина?
по моему предложеный sql-запрос который в начале написал @linker является абсолютно ефективным и правельным.
также загаживание сесии идишниками юзера тоже не особо хорошая идея, но если ты все же на это решилась, то можеш наляпать эти идшки и во время считывания запроса который @linker написал.
к стате так как ты написала:
//этот список запоминаю в сессию
while( $row=mssql_fetch_array($result) )
{
$_SESSION['rr']=$row['id'];
}
то в сессии не какова списка не будет. будет просто последнее id записанно
Спустя 8 минут, 54 секунды (22.11.2010 - 14:42) linker написал(а):
Да, тут больше бы подошло
$_SESSION['rr'][] = $row['id'];
Спустя 18 минут (22.11.2010 - 15:00) zvezda_t написал(а):
SlavaFr
а ну да) на самом деле так:
а ну да) на самом деле так:
while( $row=mssql_fetch_array($result) )
{
$m_id[]=$row['id'];
}
$_SESSION['rr']=$m_id;
_____________
Что ты сделал сегодня - для завтра?
"Приидите ко Мне вси труждающиеся и обремененнии и Аз упокою вы, возмите иго Мое на себе и научитеся от Мене яко кроток есмь и смирен сердцем и обрящете покой душам вашим, иго бо Мое благо и бремя Мое легко есть."(Мф. 11:28-30)