cakephp paginator非常慢

时间:2014-01-28 18:18:06

标签: cakephp paginate paginator containable

我有一个cakephp应用程序,2.4,我遇到了Paginator组件的问题。首先,它不是数据库,它绝对是解析查询结果的执行。我安装了DebugKit,可以看到我对分页数据的mysql查询需要整整2毫秒。该表有250万条消息记录和500,000个用户。显然正确的索引已经到位。但是,控制器动作需要6167.82 ms。所以,这是我的控制器动作:

$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 ram,apache和mod_php,安装了apc并且正在为模型和核心缓存工作。数据库位于单独的服务器上。我还有一个redis服务器持久化其他用户数据和蛋糕会话数据。这里有足够的能力来解析包含大约十几行的mysql查询中的10条记录。

编辑:答案

正如Ilie Pandia首先所说,还有其他一些事情发生,例如回调,这会减慢分页速度。这实际上与分页组件无关。收件人模型的行为在第三方服务的安装回调中加载了sdk。该服务需要几秒钟才能响应。加载查询中的linkedModel以过滤结果时会发生这种情况。希望其他任何寻找蛋糕可能性能不佳的原因的人也会查看应用程序和插件中模型的回调。

2 个答案:

答案 0 :(得分:0)

我认为没有理由这么慢。

所以这表明安装了一些回调(在模型或控制器中),这些回调会进行额外的处理,并且会大大增加动作时间。

假设控制器中没有其他内容,只是你写的内容。

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

PS:你也可以尝试暂停一下DebugKit。对于某些特定情况,内省可能需要很长时间。

答案 1 :(得分:0)

为您的应用程序安装DebugKit。

检查哪个查询占用了太多时间。从那里,你应该能够追踪瓶颈。