Сегодня, благодаря чуткому саппорту одного из моих хостеров, выловили одну конструкцию, которая перегружала сервер донельзя.
А дело было в следующем несложном запросе MySQL:
SELECT * FROM mybigtable ORDER BY RAND()
В зависимости от сайта (в основном это были магазины на основе shopxml) таблица, из которой делалась выборка (нужно было 2-20 случайных позиций), содержала от 100 до 60 000 записей. В моменты особой активности пользователей и поисковых роботов на сервере наступали темные часа – load_average: 30 – это, как известно, крайне неуютная нагрузка.
Решилось все довольно просто: сначала генерируем нужное количество случайных чисел, затем делаем из них индексы (в некоторых случаях, индекс таблице начинается не с нуля), а потом просто получаем нужные записи.
Любите свои сервера и они ответят вам бесконечным аптаймом. А я завтра продолжу напрягать программистов, чтобы активнее оптимизировали ресурсоемкие части кода.
PS. Уже не первый раз мне очень помогают поднять сервер и улучшить скрипты сотрудники службы поддержки HQhost.