Zend_Paginator; это оптимизировано? - PullRequest
6 голосов
/ 02 декабря 2009

Я собираюсь использовать класс Zend_Paginator в моем проекте. Я нашел примеры класса в Интернете. Одним из них является

$sql = 'SELECT * FROM table_name ';    
$result = $db->fetchAll($sql);    
$page=$this->_getParam('page',1);    
$paginator = Zend_Paginator::factory($result);   
 $paginator->setItemCountPerPage(10));   
 $paginator->setCurrentPageNumber($page);   
 $this->view->paginator=$paginator;

в первой строке, он фактически выбирает все строки из table_name. Что если у меня есть таблица с 50000 строками? Это было бы очень неэффективно.

Есть ли другой способ использовать Zend Paginator?

Ответы [ 2 ]

12 голосов
/ 02 декабря 2009

Об этой проблеме вас может заинтересовать этот раздел руководства: 39.2.2. Адаптер DbSelect и DbTableSelect , в котором указано (цитирование, выделено) :

... адаптеры базы данных требуют более подробное объяснение.
В отличие от Считается, что эти адаптеры не получить все записи из базы данных в чтобы посчитать их.

Вместо этого адаптеры манипулируют оригиналом запрос для получения соответствующего COUNT запрос.
Пагинатор затем выполняет этот COUNT запрос, чтобы получить количество строк.

Это требует дополнительной туда-обратно в базу данных, но это во много раз быстрее, чем получение весь набор результатов с использованием count().
Особенно с большими коллекциями данные.

(на этой странице можно прочитать больше - и есть пример, который должен дать вам больше информации)


Идея состоит в том, что вы больше не будете сами получать все данные , но вы скажете Zend_Paginator, какой адаптер он должен использовать для доступа к вашим данным.

Этот адаптер будет специфичен для " данных, которые выбираются с помощью SQL-запроса ", и будет знать, как разбить его на страницы непосредственно на стороне базы данных - что означает выбор только того, что требуется, а не все данные, которые вы изначально сделали.

7 голосов
/ 02 декабря 2009

Я рекомендую передавать объект Zend_Db_Select как Zend_Paginator::factory($select);, а не передавать набор строк результатов. В противном случае вы выбираете весь набор результатов, а затем выполняете нумерацию страниц. В вашем текущем решении, если у вас есть миллион строк, вы должны выбрать все из них, прежде чем получите кусок строк, определенный текущей страницей.

...