Оптимизация скорости разбиения на страницы Doctrine 2.2 + Zend Framework

Я борюсь с производительностью Doctrine 2 при использовании HYDRATE_OBJECT. Когда я переключаюсь с HYDRATE_ARRAYна HYDRATE_OBJECT, это занимает почти в 10 раз больше времени! Я использовал доктрину 2 и zend paginatorв качестве справки:

$query = $em->createQuery($dql)
    ->setHydrationMode(\Doctrine\ORM\AbstractQuery::HYDRATE_ARRAY)
    ->setParameter('x', 1);

// Pagination
$paginator = new Doctrine\ORM\Tools\Pagination\Paginator($query, false);
$iterator = $paginator->getIterator();
die(); // 160 ms

vs

$query = $em->createQuery($dql)
    ->setHydrationMode(\Doctrine\ORM\AbstractQuery::HYDRATE_OBJECT)
    ->setParameter('x', 1);

// Pagination
$paginator = new Doctrine\ORM\Tools\Pagination\Paginator($query, false);
$iterator = $paginator->getIterator();
die(); // 1.4s

На что следует обратить внимание? Как сократить время обработки и при этом использовать HYDRATE_OBJECT? Есть ли лучший способ выполнить разбиение на страницы?

*Edit: Использование ->setFirstResult($itemsPerPage * $page - $itemPerPage)->setMaxResults($itemsPerPage);значительно сокращает время загрузки, но при использовании $iterator :

$adapter =  new \Zend_Paginator_Adapter_Iterator($iterator);
$zend_paginator = new \Zend_Paginator($adapter);          
$zend_paginator->setItemCountPerPage($itemsPerPage)
    ->setCurrentPageNumber($page);

Zend знает только о $itemsPerPage, ( count($iterator) == $itemsPerPage) и поэтому ссылки на страницы всегда вычисляют только 1 страницу. Как я могу правильно разбить страницы с помощью Zend_Paginator и загрузить только объекты $itemsPerPage?

5
задан Community 23 May 2017 в 12:30
поделиться