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);
вместо передачи набора строк результата. В противном случае вы выбираете весь набор результатов, а затем выполняете нумерацию страниц. В вашем текущем решении, если у вас есть миллион строк, вы должны выбрать все из них, прежде чем получите кусок строк, определенный текущей страницей.