Начал смотреть, по коду и БД можно было судить, что над проектом работало уже много программистов от грамотных и до безобразия бездарных. Обо всем по порядку.
1) БД. Туча индексов, композитные индексы по 15 строк, которые в принципе не могут быть задействованы, а те которые задействовались в большинстве случаев имели низкую селективность.
В итоге таблица в 500 000 строк просматривалась полностью.
Подумаешь! Индексы для слабаков. Мы за хардкор. :D
2) Профилирование показало, что на главной странице выполняется 400 запросов. Детальный анализ показал, что 323 из них идентичны! На остальных страницах также наблюдалать подобная ситуация.
Подумаешь! Мы не бедняки, чтоб на запросах экономить.
3) Контрольный в голову был после обнаружения подобных участков кода повсеместно.
ORM::factory('product')->where("watch", "=", 1)
->and_where("dateend",">",time())
->find_all()
->count()
Это участок кода на Kohana фреймворк с использованием ORM. Для тех кто не знает, данная запись выберет все записи из БД подходящие под критерии и заполнит этими данными модели, а потом просто подсчитает их количество.
На текущий момент такой запрос выбирает каких то 420 000 строк извлекая из БД 110мб данных. Чтоб такой запрос отработал, на моем пк с SSD уходит 17 секунд.
Благо результат кешируется на 3 часа, а то бы для проекта пришлось арендовать датацентр :D
Но как писал выше, такие ситуации повсеместны, есть менее критичные места, но которые и не кешируются, а просто таскают данные создавая бесполезную нагрузку.
COUNT(*) не не слышали.
Вот такой вот неприятный и уже не первый подобный опыт.
_____________
Mysql, Postgresql, Redis, Memcached, Unit Testing, CI, Kohana, Yii, Phalcon, Zend Framework, Joomla, Open Cart, Ymaps, VK Api