Php zend framework paginator(zend_paginator)结果太慢

Php zend framework paginator(zend_paginator)结果太慢,php,zend-framework,zend-paginator,Php,Zend Framework,Zend Paginator,我有一个查询,运行速度太慢了。加载页面需要几分钟的时间。 我正在对超过100000条记录的表进行表连接。在我的查询中,它是抓取所有记录还是只获取页面所需的金额?我需要在查询中设置限制吗?如果我这样做了,会不会给分页器错误的记录计数 $paymentsTable = new Donations_Model_Payments(); $select = $paymentsTable->select(Zend_Db_Table::SELECT_WITH_FROM_PART); $select-&g

我有一个查询,运行速度太慢了。加载页面需要几分钟的时间。 我正在对超过100000条记录的表进行表连接。在我的查询中,它是抓取所有记录还是只获取页面所需的金额?我需要在查询中设置限制吗?如果我这样做了,会不会给分页器错误的记录计数

$paymentsTable = new Donations_Model_Payments();
$select = $paymentsTable->select(Zend_Db_Table::SELECT_WITH_FROM_PART);
$select->setIntegrityCheck(false)
    ->from(array('p' => 'tbl_payments'), array('clientid', 'contactid', 'amount'))
    ->where('p.clientid = ?', $_SESSION['clientinfo']['id'])
    ->where('p.dt_added BETWEEN  \''.$this->datesArr['dateStartUnix'].'\' AND \''.$this->datesArr['dateEndUnix'].'\'')
        ->join(array('c' => 'contacts'), 'c.id = p.contactid', array('fname', 'mname', 'lname'))
        ->group('p.id')
        ->order($sortby.' '.$dir)
        ;
        $payments=$paymentsTable->fetchAll($select);

// paginator
$paginator = Zend_Paginator::factory($payments);
$paginator->setCurrentPageNumber($this->_getParam('page'), 1);
$paginator->setItemCountPerPage('100'); // items pre page
$this->view->paginator = $paginator;

$payments=$payments->toArray();
$this->view->payments=$payments;

在代码中,您是:

首先,选择并获取符合条件的所有记录 请参阅选择。。。从…起诸如此类 还有刚刚打电话给fetchAll的电话 而且,只有,你在使用paginator, 在fetchAll调用返回的结果上。 有了这些,我想说,是的,所有100000条记录都是从数据库中提取的,由PHP操作,传递给Zend_Paginator,Zend_Paginator必须处理它们。。。结果几乎把它们都扔掉了

使用,您应该能够将Zend_Db_Select的实例传递给它,并让它执行查询,指定所需的限制


也许关于的示例可以帮助您理解如何实现这一点对不起,我没有任何有效的示例。

请参阅下面的修订代码。您需要通过正确的适配器将$select传递给Zend_Paginator。否则,您将看不到性能优势

$paymentsTable = new Donations_Model_Payments();
$select = $paymentsTable->select(Zend_Db_Table::SELECT_WITH_FROM_PART);
$select->setIntegrityCheck(false)
    ->joinLeft('contacts', 'tbl_payments.contactid = contacts.id')
    ->where('tbl_payments.clientid = 39')
    ->where(new Zend_Db_Expr('tbl_payments.dt_added BETWEEN "1262500129" AND "1265579129"'))
    ->group('tbl_payments.id')
    ->order('tbl_payments.dt_added DESC');

// paginator
$paginator = new Zend_Paginator(new Zend_Paginator_Adapter_DbTableSelect($select));
$paginator->setCurrentPageNumber($this->_getParam('page', 1));
$paginator->setItemCountPerPage('100'); // items pre page
$this->view->paginator = $paginator;

请参阅上面的修订代码

我个人通过count*计算结果,并将其传递给zend_paginator。我一直不明白你为什么要把zend_paginator直接链接到数据库结果中。我能看出优点和缺点,但事实上,这是远远不够的

记住,你只想要100个结果,你得到了10万个以上的结果,然后zend_paginator就把它们扔掉了。事实上,你只想数一数

    $items      = Eurocreme_Model::load_by_type(array('type' => 'list', 'from' => $from, 'to' => MODEL_PER_PAGE, 'order' => 'd.id ASC'));
    $count      = Eurocreme_Model::load_by_type(array('type' => 'list', 'from' => 0, 'to' => COUNT_HIGH, 'count' => 1));

    $paginator = Zend_Paginator::factory($count);
    $paginator->setItemCountPerPage(MODEL_PER_PAGE);
    $paginator->setCurrentPageNumber($page);

    $this->view->paginator = $paginator;
    $this->view->items = $items;

但是如果我对查询使用限制,分页结果会不会不正确?它可能会显示错误的页数,因为我告诉它结果较少。或者我需要做两个查询,一个用于分页器,另一个用于结果?不确定。根据我的理解,你不应该自己做一个查询:你应该让Zend_Paginator做查询,指定正确的限制本身-它将知道正确的页数它将做一个计数查询,我想谢谢Simon,但我试过了,它仍然挂在那里。如果我通过PhpMyAdmin运行相同的查询,它将在一秒钟内运行,并产生16000个结果。以下是查询:选择tbl_payments.clientid、tbl_payments.contactid、tbl_payments.amount、contacts.fname、contacts.mname、,tbl_payments中的contacts.lname离开contacts.id=tbl_payments.contactid,其中tbl_payments.clientid=39和tbl_payments.dt_在“1262500129”和“1265579129”组之间添加了tbl_payments.id订单tbl_payments.dt_添加了说明是否有方法使用简单的sql查询用于分页器?也许它会起作用,我的错。我应该看看你的全部代码。它起作用了!!非常感谢你,西蒙。看起来我需要Zend_Db_Expr来进行一些查询。