|
|
|
| Доброго времени суток.
Читал где-то, что при оптимизации скрипта стараються уменьшить количество запросов к базе.
Задача:
В БД есть 2 таблицы users И friends, нужно подсчитать и показать в пользовательском меню сколько других юзеров хотят добавить его в друзья. Я сделал 2 варианта:
1 при равторизации пользователя усложнил запрос и занес в сессию количество таких пользователей(как-то так):
<?
//
mysql_query(SELECT users.id,COUNT(friends.id) as count_new_friends FROM users LEFT join friends
ON (users.id=friends.second AND friends.status=0) WHERE users.login='tvv' AND
users.pass='e10adc3949ba59abbe56e057f20f883e' AND users.mail_rel='1' GROUP BY users.id);
// ну ниже непосредственно обработка(прошла ли авторизация и прочее)
//и занос count_new_friends - в сессию
|
преимущества - только единственный запрос к базе за всю сессию(при авторизации)(не делаються запросы когда пользователь перезодит между страницами)
недостаток - усложняеться запрос и я не знаю как поведет себя такой скрипт в случае большого количества записей в таблицах, при каждой перезагрузке страницы нужно лезть в файл хранящий сессию
Второй вариант:
<?
mysql_query("SELECT COUNT(id) FROM friends WHERE second=2 AND status=0");
// ну и ниже оформляем страничку
|
преимущество: простой и достаточно быстрый запрос, не нужно лезть в файл сессии каждый раз
недостаток: вызываеться при каждой обращении к странице
Что меня смущает: насколько я знаю обращение к файлу достаточно медленный процесс и что лучше: каждый раз дергать базу или сессию? | |
|
|
|
|
|
|
|
для: tvv123456
(17.03.2011 в 09:26)
| | Если для вас так важна скорость, то выполните профилирование:
замерьте время, потраченное на авторизацию и выяснения количества друзей в первом и во втором случаи.
<?php
$start_time = microtime(TRUE);
//Ваш код
$end_time = microtime(TRUE);
echo $end_time - $start_time;
?>
|
После этого будет видно какой вариант быстрее работает.
У первого варианта есть один недочёт: Если кто-то из пользователей захочет добавить человека в друзья, пока тот будет онлайн, то человек этого не увидит, т.к. при первом запросе этой заявки не было, а дальнейшие проверки, пока человек онлайн не производятся.
PS Советую всегда чётко определяться с приоритетами при выполнении проекта. Что важнее? Скорость работы скрипта или высокая читабельность его кода? Это позволит быстро принимать решения в подобных ситуациях. | |
|
|
|
|
|
|
|
для: Ирбис
(17.03.2011 в 10:07)
| | Замер времени в данном случае мало что даст потому, что это будет зависеть от хостинга: например сервер mysql может распологаться на другом физическом сервере и время работы базы тут во многом будет зависеть от мощности данного сервера и его загрузки в данный момент.
А тот недочет который вы написали и который не учел я(насчет того что если человек он-лайн, то он не увидит новых друзей пока не перезайдет), скорее всего заставит сделать выбор в пользу второго варианта. | |
|
|
|
|
|
|
|
для: tvv123456
(17.03.2011 в 11:33)
| | А база данных где хранит данные? На диске в файлах. Так что вы променяете шило на мыло, если будете хранить сессии в базе. Другое дело, если сессии в базе облегчают вам какую-либо работу.
Если уж говорить про производительность, то лучшим решением будет монтирование папки со стандартными сессиями в оперативную память. | |
|
|
|
|
|
|
|
для: Саня
(17.03.2011 в 12:27)
| | > Другое дело, если сессии в базе облегчают вам какую-либо работу.
Вы немного не поняли вопроса. никто не собираеться хранить сессии в базе, вопрос скорей всего стоял так: какой вариант будет лучше экономить ресурсы.
Вообщем-то я уже определился с вариантом, так как первый способ имеет один существенный недостаток(если человек он-лайн, то ему не покажеться уведомление о новых друзьях) | |
|
|
|