[mySql] получение случайной записи.
1. Есть таблица со списком ссылок, у каждой ссылки - автор(ФК на таблицу юзеров)
2. Таблица юзеров
3. Таблица друзей(ФК-ФК от юзеров). Связь многие ко многим замкнутая на ожну таблицу
Задача.
Вытащить СЛУЧАЙНУЮ ссылку пренадлежащую СЛУЧАЙНОМУ другу.
Вариант вытащить просто случайную ссылку из тех, что принадлежат друзьям - не походит, так как чем большу у человека ссылокЮ тем выше вероятность выпадения его ссылки. А нужно что бы, вероятность выпадения каждого друга была одинакова.
Гугл помог найти только ну ООЧЕНЬ не оптимальный вариант с group by и двумя ORDER BY RAND() - что при большом кол-ве записей = заднице.
Вобщем, кто что подскажет.
Может какаю-то часть оптимальнее вынести на ПХП?
http://habrahabr.ru/blogs/mysql/55864/
http://habrahabr.ru/qa/1269/
http://habrahabr.ru/blogs/mysql/54176/
http://www.google.com/search?client=opera&rls=ru&q=%D1%81%D0%BB%D1%83%D1%87%D0%B0%D0%B9%D0%BD%D0%B0%D1%8F+%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D1%8C+mysql&sourceid=opera&ie=utf-8&oe=utf-8&channel=suggest
тем более есть вероятность вобще получение пустого результата, так как у меня есть еще условия для выборки.
две остальных.. LIMIT БОЛЬШОЕ_ЧИСЛО, 1 - ИМХО не сильно лучше ORDER BY RAND()
Ну а гугл, как я писал выдает чаще этот самый ордер.
Конечно я продолжаю копатся.. просто времени мало, так что надеюсь еще и на вашу помощь
еще есть варианты с хранимой процедурой - рандомом берем число от 1 до максимального значения ID - вытаскиваем запись с таким ID
основным минусом будет то, что если присутствуют дыры (несуществующие ID внутри интервала), то такой способ не подходит
сколько у вас там записей в базе ? миллиарды?
еще есть варианты с хранимой процедурой - рандомом берем число от 1 до максимального значения ID - вытаскиваем запись с таким ID
основным минусом будет то, что если присутствуют дыры (несуществующие ID внутри интервала), то такой способ не подходит
сколько у вас там записей в базе ? миллиарды?
Нет. Записей пока не много. около 10к на 1.5к юзерей. Но проэкт еще не запущен на полную мощность. так что смею ожикдать около 100к, хотя бы в очень ближайшем будущем.
Также дыры - будут, хотя бы потому что мне не просто случайная запись нужна, а случайная запись с where условием. так что даже 1ый линк не особо поможет..
Да и главный вопрос был не насколько, как оптимальней получит случайную запись, а как получить случайную запись по критерию, который тоже случаен.
т..е выбрать случайного юзера(друга) и случайную запись созданую им.
не вижу причин беспокоится на вашем месте
поясните насчет случайного критерия
не вижу причин беспокоится на вашем месте
поясните насчет случайного критерия
В первом же посте написано
Вобщем нужно
И вопрос как лучше. Отдельными двумя запросами? Или вобще как-то подругому.
Эт почему?
совсем не быстрее..если каждый отдельно, на теперешнем обьеме - довольно быстро, то обьеденыый почти 0.5 сек
да, и с какого обьема можно начать беспокоится..?
проверьте на какие поля выставлены индексы... учитывая что это mysql проверьте какой engine используется для базы. Беспокоиться стоит тогда, когда начнет явно тормозить. Я не знаю архитектуру вашего проекта, но почти уверен, что до 200-500 тысяч записей можно смело ни о чем не беспокоится.
Не всегда. В контексте MySQL с InnoDB два запроса отработают чуть быстрее, чем один с JOIN-ом. Но в контексте сетевого приложения один запрос может быть выгоднее ввиду меньших накладных сетевых расходов.