ZF2 paginator性能与fetchAll没有限制?

时间:2013-04-19 14:23:07

标签: zend-framework2 zend-paginator

ZF2中的大多数情况 我会像这样做一个分页器:

public function fetchAll()
{
 $resultSet = $this->tableGateway->select();
 return $resultSet;
}

$iteratorAdapter = new \Zend\Paginator\Adapter\Iterator($this->getSampleTable()->fetchAll());
$paginator = new \Zend\Paginator\Paginator($iteratorAdapter);

这个aproch的问题在于它不限制查询结果,fetchAll返回所有结果(在db和php之间产生大的交通)。

在纯PHP中我会像这样做一个分页:

$PAGE_NUM = $_GET['page_num'];
$result_num = mysq_query("SELECT * FROM table WHERE some condition");
$result = mysq_query("SELECT * FROM table WHERE some condition LIMIT $PAGE_NUM, 20");
echo do_paginator($result_num, 20, $PAGE_NUM);//THIS JUST MAKE THE CLASSIC < 1 2 3 4 5 >

这样做的好处是,由于mysql中的LIMIT选项,我只从DB中获取了分页所需的数据。这可以在返回太多记录的查询上获得良好的性能。

我可以使用ZF2分页器对结果有效限制,还是需要制作自己的分页器?

1 个答案:

答案 0 :(得分:1)

使用Zend\Paginator\Adapter\DbSelect适配器,它完全符合您的要求,将限制和偏移量应用于您开始提供的查询,并只提取这些记录。

  

此外,此适配器不会从数据库中获取所有记录以计算它们。相反,适配器操纵原始查询以生成相应的COUNT查询。然后,Paginator执行该COUNT查询以获取行数。这确实需要额外的数据库往返,但这比获取整个结果集和使用count()要快许多倍,特别是对于大量数据集。

相关问题