Yii2 и ORM: как правильно делать большие выборки из базы данных?
Вопрос скорее даже не к ORM именно Yii, а вообще к ORM как схеме доступа к данным.
Есть страница с расписаниями мероприятий на неделю, таблица может содержать до 200-300 моделей типа Event, и для каждой модели еще запрашиваются по 2-3 связи. В итоге эта страница грузится 1-1.5 секунды.
Я пробовал через with сразу связи подгрузить (eager loading), но такой запрос с IN и тучей id в нем, только еще ухудшает ситуацию.
Да, когда на странице по 10-20 элементов то вообще никаких проблем нет, всё быстро и хорошо, но иногда нужно строить такие выборки. Как правильно делать выборки с большим количеством моделей на одной странице?
Если вы считаете, что на формирование второго запроса уходит много времени, то можно использовать joinWith().
Если у вас нет особой логики в моделях, то поможет это: www.yiiframework.com/doc-2.0/guide-db-active-recor...
P.S. 200-300 объектов с 2-3 связями не создают 1с нагрузку, дольше происходит рендер. Если оптимизировать view или кэшировать - то избавитесь от проблемы.
Да на самом деле то DAO тут не причем. DAO - это просто обертка, которая позволяет собрать sql запрос красивым способом. В принципе также можно "руками" нужный sql написать. DAO не вносит замедления. А вот получение данных в виде AR моделей - да!
Думаю Yii здесь не причем. Точнее его ORM. Все эти ее преобразования\создания объектов которая делает его ORM (точнее - ActiveRecord) - это все мелочи, у вас тормозит что-то другое.
Тут надо:
1. Профилировать сам запрос. Возможно у вас сама выборка тормозит, индексов не хватает, или еще чего.
2. Поиграть с with: посмотреть что лучше работает: with/joinWith(он вообще подгрузит все одним запросом), или вообще без with (то есть отложенная загрузка - в некоторых кейсах лучше так).
3. Обратить внимание что происходит после выборки - возможно, тормозит пост-обработка.
4. Посмотреть на сами модели: если у вас там на каждую модель навешивается куча бихейверов - тоже возможно тупить (правда у нас это начинало тупить когда выбирали десятки тысяч моделей)