【问题标题】:zend framework paginator (Zend_Paginator) results too slowzend 框架分页器(Zend_Paginator) 结果太慢
【发布时间】:2012-06-20 10:32:21
【问题描述】:

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

$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;

【问题讨论】:

    标签: php zend-framework zend-paginator


    【解决方案1】:

    请参阅下面的修改后的代码。您需要通过正确的适配器将$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;
    

    请看上面修改后的代码!

    【讨论】:

    • 谢谢西蒙,但我试过了,它仍然挂在那里。如果我通过 PhpMyAdmin 运行相同的查询,它会在一秒钟内运行 16,000 个结果。这是查询: SELECT tbl_payments.clientid, tbl_payments.contactid, tbl_payments.amount , contacts .fname, contacts.mname, contacts.lname FROM tbl_payments LEFT JOIN contacts ON contacts.id = tbl_payments.contactid WHERE tbl_payments.clientid=39 AND (tbl_payments.dt_added BETWEEN '1262500129' AND '1265579129') GROUP BY tbl_payments.id ORDER BY tbl_payments.dt_added DESC
    • 有没有办法使用纯 sql 查询来用于分页器?也许它会起作用。
    • 我的坏。我应该看看你的整个代码。有用!!非常感谢西蒙。看起来我需要 Zend_Db_Expr 来进行一些查询。
    【解决方案2】:

    在您的代码中,您是:

    • 首先,选择并获取符合您条件的所有记录
      • 查看select ... from... 等等
      • 然后拨打fetchAll 就在之后
    • 而且,只有你正在使用分页器,
      • fetchAll 调用返回的结果。

    有了这个,我想说,是的,你所有的 100,000 条记录都是从数据库中提取的,由 PHP 操作,传递给 Zend_Paginator ,它必须与它们一起工作......只是丢弃几乎所有它们。


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

    也许关于DbSelect and DbTableSelect adapter 的示例可能会帮助您了解如何实现这一点(抱歉,我没有任何工作示例)

    【讨论】:

    • 但是如果我对查询使用限制,分页结果会不会不正确?它可能会显示错误的页面数量,因为我告诉它结果较少。还是我需要做 2 个查询,一个用于分页器,一个用于结果?不确定。
    • 你不应该(据我了解)自己做一个查询:你应该让Zend_Paginator做查询,指定正确的limit本身——它将知道正确数量的页面(我想它会执行 count 查询)
    【解决方案3】:

    我个人通过 COUNT(*) 计算结果并将其传递给 zend_paginator。我从来不明白你为什么要将 zend_paginator 直接链接到数据库结果中。我可以看到优点和缺点,但实际上,它远非恕我直言。

    请记住,您只需要 100 个结果,您将获取 100'000+,然后 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;
    

    【讨论】:

      猜你喜欢
      • 2011-07-11
      • 1970-01-01
      • 1970-01-01
      • 2011-10-05
      • 2016-02-25
      • 2012-02-06
      • 2020-01-05
      • 1970-01-01
      • 2011-03-03
      相关资源
      最近更新 更多