Задать вопрос

Yii2 и ORM: как правильно делать большие выборки из базы данных?

Вопрос скорее даже не к ORM именно Yii, а вообще к ORM как схеме доступа к данным.

Есть страница с расписаниями мероприятий на неделю, таблица может содержать до 200-300 моделей типа Event, и для каждой модели еще запрашиваются по 2-3 связи. В итоге эта страница грузится 1-1.5 секунды.

Я пробовал через with сразу связи подгрузить (eager loading), но такой запрос с IN и тучей id в нем, только еще ухудшает ситуацию.

Да, когда на странице по 10-20 элементов то вообще никаких проблем нет, всё быстро и хорошо, но иногда нужно строить такие выборки. Как правильно делать выборки с большим количеством моделей на одной странице?
  • Вопрос задан
  • 3354 просмотра
Подписаться 6 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 3
bitver
@bitver
Если вы считаете, что на формирование второго запроса уходит много времени, то можно использовать joinWith().
Если у вас нет особой логики в моделях, то поможет это: www.yiiframework.com/doc-2.0/guide-db-active-recor...

P.S. 200-300 объектов с 2-3 связями не создают 1с нагрузку, дольше происходит рендер. Если оптимизировать view или кэшировать - то избавитесь от проблемы.
Ответ написан
Комментировать
В таком случае я бы не рекомендовал получать эти данные в виде моделей.
В Yii есть такая замечательная вещь как DAO
Ответ написан
mitaichik
@mitaichik
Думаю Yii здесь не причем. Точнее его ORM. Все эти ее преобразования\создания объектов которая делает его ORM (точнее - ActiveRecord) - это все мелочи, у вас тормозит что-то другое.

Тут надо:

1. Профилировать сам запрос. Возможно у вас сама выборка тормозит, индексов не хватает, или еще чего.

2. Поиграть с with: посмотреть что лучше работает: with/joinWith(он вообще подгрузит все одним запросом), или вообще без with (то есть отложенная загрузка - в некоторых кейсах лучше так).

3. Обратить внимание что происходит после выборки - возможно, тормозит пост-обработка.

4. Посмотреть на сами модели: если у вас там на каждую модель навешивается куча бихейверов - тоже возможно тупить (правда у нас это начинало тупить когда выбирали десятки тысяч моделей)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы