В Yii2 для оптимизации использования ORDER BY RAND() можно использовать следующий подход:
1. Используйте функцию RAND() только один раз и сохраните результат в переменную:
$random = rand();
2. Создайте выражение SQL для сортировки, включив переменную $random
:
$randomSortExpression = new yiidbExpression('RAND(:random)', [':random' => $random]);
3. Воспользуйтесь методом orderBy() модели или запроса для добавления выражения сортировки:
$query->orderBy($randomSortExpression);
Таким образом, ORDER BY RAND() будет выполнено только один раз для каждого запроса или итерации, что значительно повысит производительность.
Пример полного запроса может выглядеть так:
$random = rand(); $randomSortExpression = new yiidbExpression('RAND(:random)', [':random' => $random]); $query = MyModel::find() ->orderBy($randomSortExpression) ->limit(10) ->all();
Здесь MyModel
- это имя вашей модели, которую вы используете для работы с данными.
Обратите внимание, что при использовании данного подхода, порядок сортировки не будет меняться в рамках одной итерации или запроса. Однако, при каждом новом запросе или итерации порядок сортировки будет случайным.