Замена ORDER BY RAND() в MySQL

вторник, 29 марта 2011 г.

Всем, кто связан с MySQL, известно, что конструкция вида 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 коммент.:

plutov.by комментирует...

Еще одна интересная статья на эту тему: http://plutov.by/post/order_by_rand_performance

GIN комментирует...

Спасибо за ссылку, добавлю ее в статью.

plutov.by комментирует...
Этот комментарий был удален автором.

Copyright © 2010 WEB IT blog