Zend_Paginator的;它优化了吗?

时间:2009-12-01 22:26:18

标签: 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;

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

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

2 个答案:

答案 0 :(得分:12)

关于此问题,您可能会对本手册的这一部分感兴趣:39.2.2. The DbSelect and DbTableSelect adapter,其中说明(引用,强调我的)

  

......数据库适配器需要一个   更详细的解释。与此相反   人气相信,这些适配器不会   从中获取数据库中的所有记录   为了统计它们。

相反,   适配器操纵原始   查询生成相应的   COUNT查询。
然后Paginator执行   COUNT查询获取的数量   行。

这确实需要额外的费用   往返数据库,但这个   比取得快几倍   整个结果集并使用count() 。   
特别是大量的收藏品   数据

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


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

此适配器将特定于“通过SQL查询提取的数据”,并且将知道如何在数据库端直接对其进行分页 - 这意味着只获取所需内容,以及并非所有数据都像你一样。

答案 1 :(得分:7)

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