我有一个 cakephp 应用程序 2.4,但 Paginator 组件有问题。首先,它不是数据库,它肯定是解析查询结果的执行。我安装了 DebugKit,可以看到我对分页数据的 mysql 查询需要整整 2 毫秒。该表有 250 万条消息记录和 500,000 个用户。显然,适当的索引已经到位。但是,控制器动作需要 6167.82 毫秒。所以,这是我的控制器操作:
$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。然后,当 cake 从查询结果构建数组时,由于我假设有额外的用户数据,它在可包含的情况下执行速度慢了近 500 毫秒。
我现在要深入研究 Cake Paginator 组件,看看为什么构建响应需要这么长时间。我希望有人能打败我,并有一个很好的解决方案来帮助加快速度。
我的 Web 服务器正在运行 ubuntu 12.04,带有 3gb ram、apache 和 mod_php,安装了 apc 并为模型和核心缓存工作。数据库位于单独的服务器上。我还有一个 redis 服务器保存其他用户数据和蛋糕会话数据。这里有足够的能力从包含大约十二行的 mysql 查询中解析 10 条记录。
编辑:答案
正如 Ilie Pandia 首先建议的那样,发生了其他事情,例如回调,这正在减慢分页速度。这实际上与分页组件无关。Recipient 模型的行为在 3rd 方服务的设置回调中加载了 sdk。该服务需要几秒钟才能响应。这发生在加载查询中的linkedModel 以过滤结果时。希望其他寻找 cake 可能表现不佳的原因的人也会查看应用程序和插件中模型的回调。