Всем, кто связан с MySQL, известно, что конструкция вида ORDER BY RAND() для случайно выборки малопригодна. При больших количествах записей в таблицах сервер может надолго уйти в раздумья, если пользователей много.
Некоторые замеры по времени выполнения выборок из 8436 записей:
Первый вариант самый медленный. Выбираются все 8346 записей и из них потом уже выбираются 10 случайных.
Второй вариант быстрее первого в 4 раза за счет использования уточнящего параметра в WHERE.
Третий вариант оказался самым быстрым за счет использования временной таблицы, в которую пишутся только id и используется уточнящий параметр в WHERE.
Конечно же, существует еще масса способов заменить или ускорить конструкцию ORDER BY RAND(), но сегодня мы рассмотрели только 3 примера.
UPD: Интересный метод Производительность ORDER BY RAND() LIMIT
UPD2: Еще один очень хороший вариант оптимизации ORDER BY RAND()
Некоторые замеры по времени выполнения выборок из 8436 записей:
SELECT * FROM `gg_games` ORDER BY RAND() LIMIT 10;
Время выполнения 0.125 мсSELECT * FROM `gg_games` WHERE type_id = 1 ORDER BY RAND() LIMIT 10;
Время выполнения 0.032 мс
SELECT `gg_games`.* FROM (
SELECT id FROM `gg_games`
WHERE type_id = 1
ORDER BY RAND()
LIMIT 10
) as ids JOIN `gg_games` ON `gg_games`.id = ids.id;
Время выполнения 0.016 мсПервый вариант самый медленный. Выбираются все 8346 записей и из них потом уже выбираются 10 случайных.
Второй вариант быстрее первого в 4 раза за счет использования уточнящего параметра в WHERE.
Третий вариант оказался самым быстрым за счет использования временной таблицы, в которую пишутся только id и используется уточнящий параметр в WHERE.
Конечно же, существует еще масса способов заменить или ускорить конструкцию ORDER BY RAND(), но сегодня мы рассмотрели только 3 примера.
UPD: Интересный метод Производительность ORDER BY RAND() LIMIT
UPD2: Еще один очень хороший вариант оптимизации ORDER BY RAND()
3 коммент.:
Еще одна интересная статья на эту тему: http://plutov.by/post/order_by_rand_performance
Спасибо за ссылку, добавлю ее в статью.
Отправить комментарий