Главная > MySQL > MySQL. Выборка записей в случайном порядке.

MySQL. Выборка записей в случайном порядке.

В случае, когда из таблицы нужно выбрать записи и при этом отсортировать их случайным образом, крайне не желательно использовать запрос следующего вида:

Нежелательной, с точки зрения производительности, является конструкция
ORDER BY RAND()
В таких случаях более производительным вариантом будет использование следующей хранимой процедуры с последующим запросом:

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

В данном случае процедура создаст временную таблицу table_name_rands и запишет в нее 1000 случайных id из таблицы table_name.
Теперь можно производить выборку данных:

В результате выполнения этого запроса получаем 1000 записей из таблицы table_name, отсортированных случайным образом.
При выборке большого количества записей львиную долю времени забирает выполнение процедуры, поскольку там в цикле производится вставка n-записей. Но, суммарно, время, затраченное на выполнение процедуры (генерация случайных id и запись их во временную таблицу) + последующая выборка, или обновление, или удаление, меньше, чем если бы выборка и сортировка выполнялась с использованием конструкции ORDER BY RAND(). Поскольку, при выполнении ORDER BY RAND(), происходит то же, что мы делали в процедуре, только для всей исходной таблицы! Т.е. создается временный столбец, в который записываются случайные id и потом происходит сортировка по этому столбцу.
А теперь представьте, что в исходной таблице, например, 3 млн. записей, а вам нужно выбрать 500.
Преимущество описанного способа – очевидно.
Будьте здоровы!



  1. Комментариев пока нет.
  1. Трекбеков пока нет.