我有一个Cake应用程序v2.3.1在mamp v2.1.3本地运行(不是pro,所以这是最新版本)来自myapp.dev:port,当我在网站上进行分页时,我遇到了一些非常慢的响应(大约5秒钟),这是我在控制器中的代码:
public $paginate = array(
'fields' => array('Artist.id, Artist.year_born, Artist.year_died, Artist.country_born'),
'limit' => 50,
'order' => array('Artist.id' => 'desc')
);
我在AppController.php中使用twitter bootstrap插件作为我的分页https://github.com/slywalker/TwitterBootstrap:
public $helpers = array('Paginator' => array('className' => 'TwitterBootstrap.BootstrapPaginator'));
我尝试将分页的limit
设置为1并尝试使用蛋糕自己的分页而不是引导程序,但它仍然非常慢。我必须成为分页的东西,因为我可以访问像myapp.dev:port/artists/view/14532这样的艺术家,并且效果很好所以我认为它与sql查询没有任何关系。
我尝试更改/ etc / hosts文件127.0.0.1 localhost myapp.dev
和::1 localhost myapp.dev
中的名称,但似乎没有任何效果。有任何想法吗?我真的被卡住了。
更新:不提及我的Artist表所具有的hasMany关系感觉有点不好。这是我的艺术家模型:
class Artist extends AppModel {
public $hasMany = array(
'ArtistBiography' => array('dependent' => true),
'ArtistSurname' => array('dependent' => true),
'ArtistSignature' => array('dependent' => true),
'ArtistForename' => array('dependent' => true),
'ArtistMonogram' => array('dependent' => true));
public $hasOne = array(
'ArtistActive' => array('dependent' => true));
}
我使用了DebugKit,我发现paginator为两个左连接做了2个不必要的查询,每个左连接都需要大约2000毫秒来执行。如何告诉分页器忽略它?我试过这样的事情来建立一种新的关系:
public $paginate = array(
'fields' => array('Artist.id, Artist.year_born, Artist.year_died, Artist.country_born'),
'limit' => 50,
'order' => array('Artist.id' => 'desc'),
'joins' => array(
array('table' => 'artist_forenames', 'alias' => 'ArtistForename', 'type' `=> 'inner', 'conditions' => array('Artist.id = ArtistForename.artist_id')),`
array('table' => 'artist_surnames', 'alias' => 'ArtistSurname', 'type' => 'INNER', 'conditions' => array('Artist.id = ArtistSurname.artist_id'))),
'recursive' => -1
);
但我不确定如何使这项工作。我最想要的是加入artist_surnames
和artist_fornames
并忽略两个名为artist.actives
和artist_monogram
的表格,这两个表格一起减慢了4000毫秒的查询速度。
我的第二个问题是为什么这两个连接减慢了这么多?我做了一个名为artists / all的测试视图,我在那里列出了100位艺术家,并且我在所有连接中的查询都是在40-50ms左右完成的。
答案 0 :(得分:3)
<强> TLDR:强>
$recursive
设为-1
代码示例:
//wherever you set this variable
$paginate = array(
'recursive' => -1,
'limit' => 50,
'order' => array('Artist.id' => 'desc'),
'contain' => array(
'ArtistSurname',
'ArtistForName'
)
);
请记住查看Containable的文档 - 它解释了如何将模型设置为$actsAs
可容纳,将递归设置为-1 ...等等。
我建议在你的AppModel中实际设置public $recursive=-1'
和public $actsAs =array('Containable');
- 这样就可以设置所有模型并随时随地使用Containable。此外,任何高于-1的递归都是糟糕的恕我直言 - 包含在各个方面都要好得多。