我即将在我的项目中使用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吗?
答案 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);
传递,而不是传递结果行集。否则,您将选择整个结果集,然后进行分页。在当前的解决方案中,如果您有一百万行,则在获取当前页面定义的行块之前,您将选择所有行。