- 1
SELECT * FROM goods ORDER BY rand() LIMIT 10;
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
−44
SELECT * FROM goods ORDER BY rand() LIMIT 10;
В одном крупном московском интернет-магазине встала задача на главной странице сайта выдавать 10 случайных товарок. Как это было сделано, смотрите выше.
Сайт несколько прилёг.
В вот пример костыля, решающего эту проблему: http://plutov.by/post/order_by_rand_performance
К тому же, незачем так напрягаться ради каждого посетителя сайта. Кэширование тоже весьма полезно.
Да, нужен список id'шников. Но не обязательно выгребать его из базы каждый раз.
В итоге был написан скрипт, который делает для всех пользователей раз в 10 минут.
можно сгенерировать скриптом базы, суть не поменяется, не?
Хаха. А почему не O(1)?
потому что базе необходимо сначала построить резалтсет, с учетом всех этих group order и т.д., потом "промотать" записи, которые надо поскипать, и лишь затем клиенту отдавать те строки, которые он попросил
а если ты требуешь от СУБД _конкретные_ записи (а передавая в селект рандом ты хочешь именно этого), то будь добр предложить ей средства по эффективному извлечению этих _конкретных_ записей
в частности, индексы, партишионинг, параллельное исполнение, "кеширование" на стороне БД - да мало ли способов
а к своему посту мне нечего прибавить
Выбираем случайные строки, в коде отсеиваем дубликаты.
она будет менять результат, только когда размазывание исходных данных по физическим блокам поменялось в такой мере, что очередность обхода этих блоков стала другой (например, данных стало тупо больше, или в кеше другие блоки оказались внезапно)
когда ты не управляешь выбором подмножества - то для тебя такой результат будет как раз случайный, т.к. непредсказуемый, просто при стабильной БД он будет всегда один и тот же, хоть ты 1000 запросов сделай подряд
Рандом за О(овер_дохуя(n))