2014-01-28 77 views
3

我有一个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以过滤结果时发生这种情况。希望其他人寻找蛋糕可能表现不佳的原因也会考虑应用程序和插件中模型的回调。

+0

这种关系只是消息属于收件人还是有更多? – arilia

+0

消息属于发件人,收件人和MassMessage。我今天早上已经调试了大约一个小时,并且已经弄清楚了这么久了。尽管如此,我还没有弄清楚为什么。只要我知道更多,我会尽快更新。 – mneil

+0

我面临同样的问题。我认为这是因为Paginator组件需要总计数并首先使用WHERE 1 = 1进行查询,然后按照极限“ – zeflex

回答

0

我看不出有什么理由让它运行缓慢。

所以这表明有一些回调安装(无论是在模型或控制器)进行额外的处理,并夸大了行动时间这么多。

这是假设控制器中没有其他东西,但是你写了什么。

你可能实际上是measure the time的分页调用本身,我想你会发现它非常快。所以瓶颈在代码中的其他地方。

PS:您也可以尝试禁用一段时间的DebugKit。在某些特定情况下,反思可能需要很长时间。

+0

”分页。“我已经安装了DebugKit”,这是我的问题中的第二句。该代码是整个控制器操作。我没有写这整个东西,可能有一些回调隐藏在我不知道的地方。我也会检查并更新。谢谢 – mneil

+0

我注意到你已经安装了DebugKit,并且已经测量了查询和操作时间。我所建议的是专门手动测量分页时间。你可能会注意到它几乎是即时的,所以你会知道有一些回调涉及。并尝试禁用一个或两个测试DebugKit,看看这是怎么回事......我很好奇你发现了什么! –

+0

(我建议这是因为我不知道DebugKit实际上是如何测量动作时间的......无论有没有回调?) –

0

为您的应用程序安装DebugKit。

并检查哪个查询需要花费太多时间。从那里,你应该能够跟踪瓶颈。

+0

已安装DebugKit。我会低估这一点,但我还没有名声。查询不是很慢。 2MS。 – mneil