Как в Yii2 оптимизировать ORDER BY RAND()?

В 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 - это имя вашей модели, которую вы используете для работы с данными.

Обратите внимание, что при использовании данного подхода, порядок сортировки не будет меняться в рамках одной итерации или запроса. Однако, при каждом новом запросе или итерации порядок сортировки будет случайным.