Выборка случайного поля в MySQL

Здравствуйте.

До недавнего времени использовал костыль ORDER BY rand() но при увеличении таблицы его скорость падает.

Требуется вывести случайное поле. Записи фрагментированы (id не по порядку и содержит дырки).

Если это как то упростит задачу, использую ZF.
  • Вопрос задан
  • 3477 просмотров
Пригласить эксперта
Ответы на вопрос 6
winnie
@winnie
Пусть A — результат SELECT MAX(id) FROM `my_table`(его вполне можно хранить отдельно в key-value-хранилище и иногда обновлять)
Генерируем число от 1 до A включительно, пусть это B на стороне клиента (в данном случае — php приложения).
И выбираем первую запись, id которой >= B (SELECT `pole` FROM `my_table` WHERE `id` >= B LIMIT 1)
Попробуйте. Должно помочь.
Ответ написан
@vart
Уже был такой вопрос:
habrahabr.ru/qa/5525/

И топики на эту тему:
habrahabr.ru/blogs/mysql/54176/
habrahabr.ru/blogs/mysql/55864/
habrahabr.ru/blogs/mysql/104366/
Ответ написан
Комментировать
@edogs
1) Забацать таблицу id<->realid. Заполнять ее можно очень быстро посредством insert into select from. Соответственно в ней уже id не будут фрагментированы и будет очень легко выбрать.

2) Можно поступить аналогично п.1, сделав таблицу просто из realid, так же ее заполнив, и перемешать случайным образом. А случайное число выбирать позиционируя с помощью лимита, предварительно сгенерив случайное число на основе кол-ва записей.
Ответ написан
Комментировать
@betal
Если правильно понял задачу, нужно получить 1 случайную строку, из таблицы, где ид могут быть с дырками.
Навскидку LIMIT RAND($max),1
Ответ написан
EugeneOZ
@EugeneOZ
Это будет работать быстро и не боится неконсистентных последовательностей ID
max = «SELECT COUNT(*) FROM `TABLE` (можно кэшировать)
$random_start = mt_rand(0, max-1);
result = SELECT * FROM `TABLE` LIMIT ».$random_start.",1
Ответ написан
porohnya
@porohnya
Хранить промежутки
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы