Оптимизация ORDER BY RAND()

Наткнулся на статью https://ruhighload.com/%D0%9E%D0%BF%D1%82%D0%B8%D0%BC%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F+order+by+rand%28%29 Сделал по аналогии . Но данный пример работает странно : элемент повторяется через пару обновлений, хотя в базе 100 тыс записей. Подскажите, действенный метод оптимизации rand() cпасибо


Ответы (1 шт):

Автор решения: Akina

Статья - бред голимый. Ибо требует кучи оговорок, стыдливо опущенных.

ORDER BY RAND() обеспечивает равновероятный выбор любой записи (в рамках равномерности генератора, конечно), тогда как описанная методика делает эту вероятность пропорциональной количеству пропущенных (отсутствующих) последовательных значений ID после элемента (или перед - смотря какой частный подход использовать) - например, если в таблице два элемента с ID 1 и 1000000, то при использовании описанного в статье запроса у первого практически нет шансов вернуться.

Методика могла бы заработать, но для этого нужно гарантировать, что последовательность имеющихся ID как минимум непрерывна (и начинается с единицы). В большинстве случаев это означает перенумерацию записей в запросе. Да, это несложно сделать - если версия СУБД поддерживает CTE и ROW_NUMBER(). Но в любом случае это уже немножко другие время и ресурсы.

Я уж не говорю о том, что ID далеко не всегда имеет числовой тип - скажем, GUID последнее время достаточно (и зачастую небезосновательно) популярны. К ним описанную в статье методику вообще не приложить.

→ Ссылка