Под этим я подразумеваю - есть ли способ сделать:
$collection = $model->getCollection();
foreach ($collection as $item) {
$item->doStuff();
}
Таким образом, что даже если бы коллекция имела 100 тыс. Строк, она бы загружала только страницу строк за один раз из MySQL и волшебным образом разбивала их на страницы для вас за кулисами.
Смотреть на Varien_Data_Collection_Db::load()
это не представляется возможным, но просто хотелось проверить. Это похоже на то, что должно быть общей потребностью.
performance
collection
kalenjordan
источник
источник
setPageSize
потому что это семантика.core/resource_iterator
решение на самом деле не разбивает запрос на MySQL. Он загружает весь набор результатов одновременно, но затем он дает вам строку за раз, чтобы иметь дело с вашим кодом PHP. Таким образом, он предотвращает сбои памяти в PHP, но в какой-то момент запускает максимальные размеры пакетов mysql, если результирующий набор очень большой. Я думаю, что я собираюсь попытаться создать хороший абстрактный chunked resource_iterator, используяsetPageSize()
Я согласен с Беном Лессани в том, что вам следует использовать
core/iterator
модель ресурсов для загрузки больших коллекций по одной строке, если это возможно .Тем не менее, есть ограничения. Как объясняется в разделе « addAttributeToSelect не работает с core / resource_iterator? », Он не очень хорошо работает с моделями EAV, если вам нужно включить значения из таблиц значений атрибутов.
И связанный пример из StackOverflow на самом деле не так хорош, потому что он повторяет один и тот же запрос с разными
LIMIT
выражениями. Для сложных запросов это может быть проблемой производительности, но что еще более важно, вы получите дубликаты, если между ними будут добавлены новые строки.Лучший способ обработки коллекций в чанках - это сначала загрузить все идентификаторы, а затем использовать эти идентификаторы в качестве фильтра для действительной выгружаемой коллекции.
Простой пример для продуктов:
источник