Снижение нагрузки php+mysql
Вопросы:
1. Какие вообще есть методы оптимизации в подобных случаях, о которых я, возможно, не знаю ?
2. Часто видел сравнения xCache ,eAccelerator, memcached. Так и не понял толком что для чего предназначено. Посоветуйте чем лучше воспользоваться ? Слышал что xCache не использует TCP соединение и за счет это работает быстрей (если сайт расположен на одном сервере), так ли это ?
3. На сервере, 4 ГБ RAM, Вполне возможно всю базу держать в оперативке, как лучше это сделать ? Мне в голову приходит только использование MEMORY таблиц в mysql (запись делать в обычные таблицы и триггером их синхронизировать с MEMORY-таблицами, а вся выборка уже из них) насколько удачен такой способ? может быть Вы знаете другие более оптимальные ?
Еще как вариант хранить БД в tmpfs, но это для меня очень туманная перспектива. И что будет если сервер упадет и данные не успеют сохранится на диске ?
4. Так же интересны способы оптимизации самих php скриптов (допустим чтобы они держались в памяти а не прогонялись через транслятор каждый раз)
Заранее спасибо.
1 ответов
Я бы посоветовал начать с определения бутылочного горлышка в проекте. обычно оно в mysql
С mysql логгировать запросы смотреть какие из них slow query и кроме того все temp table и filesort. может быть где-то поможет грамотное построение индекса, где-то небольшое изменение структуры базы. Это самый неприятный и трудоемкий момент, но и самый продуктивный. Иногда ( а по факту почти всегда) помогает вынести часть функционала из базы в PHP, или в другую программу. Например, если регулярно встречаются запросы вида like '%что-то там%' по таблицам за 100 000 записей то это повод вынести поиск из mysql наружу. В тот же сфинкс.
Следующий этап - осмотр PHP поиск узких мест. Особенно повторных запросов в базу. Очень часто помогает локальное кеширование переменных в пределах одного скрипта или в пределах сессии.
После этого всего можно переходить к обдумыванию процедуры кеширования промежуточных данных в тот же memcache или даже на диск.
Ну и заодно если до сих пор не сделано, настройте nginx в качестве реверсного проски для апача. Это очень и очень помогает разгрузить апача и php при наличии медленных клиентов.
Ну и из личного опыта. Есть еще метод быдлооптимизации. Как правило это единственный метод, когда проект чудой, большой, куча говнокода. Все тормозит и становится колом, а заказчик не дает времени и все должно заработать вчера. Тупая обертка над всем, которая складывает сгенеренные страницы в файловый кеш. Как правило позвляет хотя-бы поднять лежащий проект и найти время на все то, что я написал выше.