首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >zend framework paginator (Zend_Paginator)结果太慢

zend framework paginator (Zend_Paginator)结果太慢
EN

Stack Overflow用户
提问于 2010-02-10 19:49:39
回答 3查看 2.2K关注 0票数 2

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

代码语言:javascript
复制
$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;
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-02-10 21:40:40

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

代码语言:javascript
复制
$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;

请看上面修改过的代码!

票数 3
EN

Stack Overflow用户

发布于 2010-02-10 19:56:02

在您的代码中,您是:

首先,选择并获取与您的条件匹配的所有记录,请参阅

  • select ... from...而所有的
  • 和对fetchAll的调用就是after

    • 返回的结果使用分页器fetchAll only

这样,是的,你所有的100,000条记录都是从数据库中获取的,由PHP操纵,传递给Zend_Paginator,它必须与它们一起工作……结果却丢弃了几乎所有的东西。

使用Zend_Paginator,您应该能够向它传递一个Zend_Db_Select实例,并让它执行查询,指定所需的limit

也许关于DbSelect and DbTableSelect adapter的示例可能会帮助您理解如何实现这一点(对不起,我没有任何可用的示例)。

票数 2
EN

Stack Overflow用户

发布于 2010-02-17 20:28:03

我个人通过COUNT(*)对结果进行计数,并将其传递给zend_paginator。我从来不明白为什么你要把zend_paginator直接链接到数据库结果中。我可以看到优点和缺点,但说真的,这太离谱了。

记住,你只想要100个结果,你得到了100,000+,然后zend_paginator就把它们扔掉了。实际上,你只想给它一个计数。

代码语言:javascript
复制
    $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;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2236514

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档