Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > PHP: Для профи > Высокая нагрузка на работу с БД. |
Автор: gogzor 3.3.2010, 18:55 | ||
Привет всем. Есть достаточно нагруженный сайт, меня попросили както переписать/оптимизировать код работы с бд (MySQL). Что пришло первое в голову это создать класс по шаблону синглтон. Т.е тогда у каждого юзера будет только 1 инстанс класса на всю сессию и 1 открытое соединение, которое обрабатывает все его запросы. Примерно так :
Сервер в распоряжении только один, так что возможности распределять всё по серверам нету. Может вы ещё чтото посоветуете? Спасибо. |
Автор: Vasay 3.3.2010, 19:43 | ||||
gogzor,
PHP - не C# ![]() Весьма радикальный вариант облегчить жизнь БД - запустить php приложение на http://www.caucho.com/ (желательно коммерческой версии ) Предварительно настроив database connection pool как JNDI ресурс сервера. И переписать всю работу с бд с использованием этого JNDI.
Тогда работа с БД будет идти через пул соединений, что при его грамотной настройке даст серьезное снижение нагрузки с сервера БД. |
Автор: gogzor 3.3.2010, 20:07 |
Vasay, спасибо, посмотрю что это за зверь. Ипатьев, спасибо, очень информативный ответ от юзера со статусом "эксперт". ![]() |
Автор: smartov 3.3.2010, 20:16 |
gogzor, прежде чем переписывать код, надо найти узкие места. Разобраться в чем они: тяжелые запросы? большое количетсво запросов? Исходя из ситуации либо оптимизировать тяжелые запросы, либо структуру базы, чтобы они не были такими тяжелыми, либо консолидировать большое количество запросов в более емкий и оптимальный. |
Автор: Ипатьев 3.3.2010, 20:34 |
Вообще, судя по формулировке задания, непонятна область ответственности топикстартера. Имеется ли у него доступ к нужной информации. Но сама, конечно, формулировка, многое говорит о тех, кто ставил задачу. Учитывая, что код доступа к бд никогда не бывает узким метстом. |
Автор: Majesty 23.7.2010, 14:38 | ||
Нужен не синглтон, а отложенная инициализация с кеширующей прослойкой. Примерно так:
Нужно добавить парсинг запроса (чтобы не кешировать INSERT/UPDATE/DELETE запросы) и проверку на возврат false из mysql_query (хотя бы возвращать $result = false, если запрос завершился ошибкой). Подключение к базе устанавливается только в том случае, если оно реально нужно. Один и тот же запрос выполняется однократно. Кеш можно сохранять в файлах, в sqlite, в memcached, в apc - где угодно (правильный кеш - тема, достойная отдельного топика). Естественно, все эти телодвижения не заменяют профилирование самих запросов - slow_queries_log и explain в помощь. Если медленные запросы всё-таки нужны, следует вынести их в асинхронный режим (например, выполнять их в кроне, записывая в тот же кеш, чтобы клиенты читали результаты только из кеша). Опять же, профилирование и оптимизация запросов - это отдельная большая тема имеющая мало общего с PHP. |
Автор: smartov 23.7.2010, 15:04 |
Majesty, 1) не надо поднимать старые темы 2) когда человек спрашивает совета как правильно отрезать ухо, если у него чешется нос, то не надо подсказывать размер ножа - нужно подсказать почесать нос (на всякий случай: это аллегория) |