Оптимизировать ORDER BY RAND() сложно, так как он требует полной выборки данных для генерации случайного числа для каждой строки. Типичные подходы:
Выборка случайного идентификатора:
OFFSET.sql
Этот метод подойдет для выборки одной или небольшого количества случайных строк. Неэффективен для большого количества строк.
Случайный выбор по диапазону id:
id.id >= случайное_число, используя LIMIT.sql
Может пропустить строки, если есть пробелы в id.
Создание временной таблицы или использование подзапроса с сортировкой по случайному числу:
id в подзапросе.ORDER BY RAND() к этому подмножеству.sql
Снижает нагрузку, если LIMIT наложен на подзапрос.
Использование дополнительного поля со случайным числом:
sql
Требует внесения изменений в схему и фонового процесса обновления.
Алгоритм "тасования" (Fisher-Yates) вне базы данных:
id (или все данные, если они небольшие).go
Подходит только для таблиц с небольшим количеством строк.
Выбор оптимального метода зависит от размера таблицы, требуемого количества случайных строк и конкретной СУБД. Для большинства случаев, когда нужно выбрать небольшое количество случайных строк из большой таблицы, комбинация получения id с последующим OFFSET или WHERE id IN (...) будет более производительной, чем чистый ORDER BY RAND().