Zend_Paginator; это оптимизировано?

Я собираюсь использовать класс 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 ответа

Решение

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

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

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

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

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


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

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

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

Другие вопросы по тегам