我有一个cakephp应用程序,2.4,并且我遇到了Paginator组件的问题。首先,它不是数据库,它绝对是解析查询结果的执行过程。我安装了DebugKit,可以看到我的分页数据的mysql查询需要整整2毫秒。该表拥有250万条消息记录和50万个用户。显然,正确的索引是到位的。但是,控制器操作需要6167.82毫秒。所以,这里是我的控制器行动:cakephp paginator极慢
$this->Paginator->settings = array(
'Message' => array(
'fields' => array(
'Recipient.username',
'Recipient.profile_photo',
'Recipient.id',
'Message.*'
),
'joins' => array(array(
'table' => 'users',
'alias' => 'Recipient',
'type' => 'LEFT',
'conditions' => array(
'Recipient.id = `Message`.`recipient_id`'
)
)),
'conditions' => array(
'Message.sender_id' => $this->Auth->user('id'),
'Message.deleted_by_sender' => '0'
),
'limit' => 10,
'order' => 'Message.id DESC',
'recursive' => -1
)
);
$sents = $this->Paginator->paginate('Message');
$this->set('sents', $sents);
$this->view = 'index';
我已经谷歌这个和搜索堆栈溢出。大部分的回应是针对糟糕的mysql优化,这不是我的情况。另一半的答复表明可以容忍。所以,我尝试了遏制。使用contains实际上比较慢,因为它试图从用户的字段中获取更多的数据,而不仅仅是用户名,照片和id。然后当蛋糕从查询结果中构建数组时,由于我假设的额外用户数据,它使用可容纳的元素执行速度将近500毫秒。
我现在要深入研究蛋糕Paginator组件,并了解为什么它需要这么长时间来构建响应。我希望有人能够击败我,并且有一个很好的解决方案来帮助加快速度。
我的网络服务器运行ubuntu 12.04与3gb内存,apache和mod_php与apc安装和模型和核心缓存工作。数据库位于单独的服务器上。我也有一个redis服务器,它保存其他用户数据和蛋糕会话数据。这里有足够的能力来解析包含大约十几行的mysql查询中的10条记录。
编辑:ANSWER
作为最早提出由伊利耶·潘迪亚还有别的东西发生,如回调,这是减缓分页。这实际上与分页组件无关。收件人模型具有在第三方服务的setup回调中加载sdk的行为。该服务需要几秒钟才能做出响应。加载查询中的linkedModel以过滤结果时发生这种情况。希望其他人寻找蛋糕可能表现不佳的原因也会考虑应用程序和插件中模型的回调。
这种关系只是消息属于收件人还是有更多? – arilia
消息属于发件人,收件人和MassMessage。我今天早上已经调试了大约一个小时,并且已经弄清楚了这么久了。尽管如此,我还没有弄清楚为什么。只要我知道更多,我会尽快更新。 – mneil
我面临同样的问题。我认为这是因为Paginator组件需要总计数并首先使用WHERE 1 = 1进行查询,然后按照极限“ – zeflex