ORDER BY RAND() кладет сервак

Сегодня, благодаря чуткому саппорту одного из моих хостеров, выловили одну конструкцию, которая перегружала сервер донельзя.

А дело было в следующем несложном запросе MySQL:

SELECT * FROM mybigtable ORDER BY RAND()

В зависимости от сайта (в основном это были магазины на основе shopxml) таблица, из которой делалась выборка (нужно было 2-20 случайных позиций), содержала от 100 до 60 000 записей. В моменты особой активности пользователей и поисковых роботов на сервере наступали темные часа – load_average: 30 – это, как известно, крайне неуютная нагрузка.

Решилось все довольно просто: сначала генерируем нужное количество случайных чисел, затем делаем из них индексы (в некоторых случаях, индекс таблице начинается не с нуля), а потом просто получаем нужные записи.

Любите свои сервера и они ответят вам бесконечным аптаймом. А я завтра продолжу напрягать программистов, чтобы активнее оптимизировали ресурсоемкие части кода.

PS. Уже не первый раз мне очень помогают поднять сервер и улучшить скрипты сотрудники службы поддержки HQhost.


Опубликовано

в

от