Order By RAND() в большой базе

Темы, не касающиеся фреймворка, но относящиеся к программированию в целом.
Ответить
BalykhinAS
Сообщения: 179
Зарегистрирован: 2018.02.05, 13:41
Контактная информация:

Order By RAND() в большой базе

Сообщение BalykhinAS »

Добрый день! Необходимо вывести случайные записи. Возник вопрос по быстродействию Order By RAND(). Первое что пришло в голову кроном выбрать переодически определенное количество ид (к примеру 5000) и записать в отдельную таблицу, позже с не выбирать случайным образом. Но верное ли решение, возможно в YII есть что то хитрое?

Код: Выделить всё

        $topProducts = (new Query())
            ->select('product_id')
            ->from('cron_top_products')
            ->orderBy('RAND()')
            ->limit(20)
            ->all();

        $products = Products::find()
            ->where(['id' => array_map(function($item) {
                return $item['product_id'];
            }, $topProducts)])
            ->limit(10)
            ->asArray()
            ->all();
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Order By RAND() в большой базе

Сообщение samdark »

Решение верное. Ещё и shuffle результатам можно делать...
Ответить