Как выбрать случайную запись из базы MySQL без использования первичного ключа и order by rand()

Возникла такая проблема, есть база данных в которой содержатся пользователи (юзеры установившие приложение вконтакте, если быть точным), в качестве Primary key используестся id пользователя в социальной сети, который можно считать случайным числом. Нужно выбрать из базы одного случайного пользователя. Пользователей в базе много поэтому order by rand() использовать слишком накладно, генерировать случайное число и выбирать запись с таким id тоже не получится, учитывая что id идут не по порядку. Как быть в такой ситуации? И заодно, как быть если нужно несколько случайных пользователей?
  • Вопрос задан
  • 12366 просмотров
Пригласить эксперта
Ответы на вопрос 6
lafayette
@lafayette
Первое, что приходит на ум: поиграться с limit, например limit <случайное число>,<размер выборки>
Ответ написан
slang
@slang
Лучшее решение — брать рандом в диапазоне, в котором лежит первичный ключ — и доставать запись, ключ которой больше или равен этому рандому. Типа такого:

SELECT * FROM my_table
WHERE pk_column >=
(SELECT FLOOR( MAX(pk_column) * RAND()) FROM my_table)
ORDER BY pk_column
LIMIT 1;

Конечно, возникают проблемы в таблицах, где удалены большие диапазоны запесей, но для этого есть тоже свои решения, вроде введения дополнительного сквозного поля без «дырок». Вот можно почитать подробнее тут
Ответ написан
Комментировать
dmitryrublev
@dmitryrublev
Веб-разработчик, зануда
добавьте таблицу вида
Ответ написан
casey
@casey
Денормализовывать id в SET в Redis и использовать SRANDMEMBER.
Ответ написан
Комментировать
kashey
@kashey
Программирую большую половину жизни
заведите поле uRAND в таблице и раз в день сидите туда истинный RAND
после чего SELECT * FROM table WHERE uRAND<somerandvalue ORDER BY uRAND DESC LIMIT 1
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы