Вот это хороший вариант, но недетерминированный по времени выполнения, против чего Михаил уже возражал.
Особенно много промахов будет вначале, пока объектов в таблице немного.
 
02.12.2013, 16:52, "Akzhan Abdulin" <[email protected]>:
посчитать селективность (запомнить однократно),
 
потом просто сгенерировать пачку псевдослучайных id и выполнить select по ним (IN) с доп. условием на доступность всем.  количество id равно количество нужным поделить на селективность.
 
Получили результат. Если недостаточно, генерируем вторую пачку и отбираем остаток.
 
Итого в среднем один запрос с поиском по PK + фильтр. Редко два.
 
Повторяемость обеспечивается выбором и настройкой алгоритма генерации случайных чисел.
 


2 декабря 2013 г., 17:27 пользователь Михаил Монашёв <[email protected]> написал:
Здравствуйте.

Есть  таблица  с  объектами  в  mysql. Новые объекты туда добавляются,
плохие  объекты  удаляются,  бывает что по много штук сразу. Некоторые
объекты  имеют  статус  скрытых  от всех, а все остальные доступны для
всех. Т.е. в таблице равномерно растёт id объектов, но между соседними
id  могут  быть  дырки, причём большие. И некоторые объекты показывать
нельзя.

Даётся  текстовая  строка.  В идеале нужно для этой строке максимально
быстро  выбрать  из  таблицы случайные 3 разных объекта, доступные для
всех.  Причём так, чтобы повторные выборы давали те же самые объекты и
изменения таблицы минимально влияли на это.

Т.е.  надо  из  перла обратиться к mysql-ю минимальное количество раз,
сделав максимально быстрые запросы. Самое важное - скорость. Ей нельзя
жертвовать. Можно жертвовать, но крайне нежелательно, привязкой строки
к  объектам. Понятно, что таблица меняется и привязки строк к объектам
будут меняться. Необходимо, чтобы эти изменения были минимальны. Можно
жертвовать  количеством  выбираемых объектов, например выбирать иногда
не  3, а 2 или 1, но не 0. Можно жертвовать степенью случайности между
выбираемыми объектами, например, выбирая лишь один случайным способом,
а  остальные  искать  поблизости от первого. Нельзя жертвовать охватом
объектов таблицы, т.е. выбираться объекты должны среди всех не скрытых
объектов.

--
С уважением,
 Михаил                          mailto:[email protected]

--
Moscow.pm mailing list
[email protected] | http://moscow.pm.org
,

--
Moscow.pm mailing list
[email protected] | http://moscow.pm.org

 
 
--
Oleg Alistratov
-- 
Moscow.pm mailing list
[email protected] | http://moscow.pm.org

Ответить