Zend_Paginator的; 它优化了吗?

Moo*_*oon 6 php zend-framework 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;
Run Code Online (Sandbox Code Playgroud)

在第一行,它实际上从table_name中选择所有行.如果我有50000行的表怎么办?那将是非常低效的.

还有其他方法可以使用Zend Paginator吗?

Pas*_*TIN 12

关于这个问题,您可能会对本手册的这一部分感兴趣:39.2.2.DbSelect和DbTableSelect适配器,声明(引用,强调我的):

...数据库适配器需要更详细的解释.
与普遍认为的相反,这些适配器不会从数据库获取所有记录以便对它们进行计数.

相反,适配器操纵原始查询以生成相应的 COUNT查询.
Paginator然后执行该COUNT查询以获得行数.

这确实需要额外的数据库往返,但这比获取整个结果集和使用要快许多倍count().
特别是对大量数据的收集.

(在该页面上还有更多要阅读的内容 - 并且有一个示例可以为您提供更多信息)


我们的想法是您不再自己获取所有数据,但是您将告诉Zend_Paginator它必须使用哪个适配器来访问您的数据.

此适配器将特定于" 通过SQL查询获取的数据 ",并且将知道如何在数据库端直接对其进行分页 - 这意味着只获取所需内容,而不是像您最初那样获取所有数据.


typ*_*ror 7

我建议传递一个Zend_Db_Select对象,Zend_Paginator::factory($select);而不是传递结果行集.否则,您将选择整个结果集,然后进行分页.在当前的解决方案中,如果您有一百万行,则在获取当前页面定义的行块之前,您将选择所有行.