- 1
SELECT * FROM goods ORDER BY rand() LIMIT 10;
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
−44
SELECT * FROM goods ORDER BY rand() LIMIT 10;
В одном крупном московском интернет-магазине встала задача на главной странице сайта выдавать 10 случайных товарок. Как это было сделано, смотрите выше.
Сайт несколько прилёг.
inkanus-gray 27.08.2015 22:10 # 0
В вот пример костыля, решающего эту проблему: http://plutov.by/post/order_by_rand_performance
Solo 27.08.2015 22:12 # +1
К тому же, незачем так напрягаться ради каждого посетителя сайта. Кэширование тоже весьма полезно.
volter9 27.08.2015 22:47 # +2
3_14dar 27.08.2015 22:13 # +2
Solo 27.08.2015 22:26 # +1
3_14dar 27.08.2015 22:57 # 0
Solo 27.08.2015 23:06 # 0
Да, нужен список id'шников. Но не обязательно выгребать его из базы каждый раз.
В итоге был написан скрипт, который делает для всех пользователей раз в 10 минут.
3_14dar 27.08.2015 23:08 # 0
можно сгенерировать скриптом базы, суть не поменяется, не?
inkanus-gray 27.08.2015 23:21 # 0
3_14dar 27.08.2015 23:36 # 0
Хаха. А почему не O(1)?
Fike 30.08.2015 15:38 # +2
defecate-plusplus 31.08.2015 20:12 # +2
потому что базе необходимо сначала построить резалтсет, с учетом всех этих group order и т.д., потом "промотать" записи, которые надо поскипать, и лишь затем клиенту отдавать те строки, которые он попросил
Fike 02.09.2015 02:01 # 0
inkanus-gray 02.09.2015 13:19 # 0
defecate-plusplus 02.09.2015 13:46 # 0
3_14dar 02.09.2015 20:26 # 0
defecate-plusplus 02.09.2015 20:56 # 0
а если ты требуешь от СУБД _конкретные_ записи (а передавая в селект рандом ты хочешь именно этого), то будь добр предложить ей средства по эффективному извлечению этих _конкретных_ записей
в частности, индексы, партишионинг, параллельное исполнение, "кеширование" на стороне БД - да мало ли способов
3_14dar 02.09.2015 20:58 # 0
defecate-plusplus 02.09.2015 21:20 # 0
а к своему посту мне нечего прибавить
3_14dar 02.09.2015 21:46 # 0
Выбираем случайные строки, в коде отсеиваем дубликаты.
defecate-plusplus 02.09.2015 22:09 # 0
она будет менять результат, только когда размазывание исходных данных по физическим блокам поменялось в такой мере, что очередность обхода этих блоков стала другой (например, данных стало тупо больше, или в кеше другие блоки оказались внезапно)
когда ты не управляешь выбором подмножества - то для тебя такой результат будет как раз случайный, т.к. непредсказуемый, просто при стабильной БД он будет всегда один и тот же, хоть ты 1000 запросов сделай подряд
3_14dar 02.09.2015 22:40 # 0
kegdan 03.09.2015 05:29 # 0
Рандом за О(овер_дохуя(n))
bormand 02.09.2015 20:57 # 0
3_14dar 02.09.2015 20:25 # −1
guest 04.09.2015 20:54 # +1
guest 04.09.2015 17:00 # 0
guest 04.09.2015 17:01 # 0
roman-kashitsyn 04.09.2015 17:04 # 0
bormand 04.09.2015 17:14 # 0
3_14dar 04.09.2015 17:49 # 0