【发布时间】:2013-05-22 22:59:14
【问题描述】:
我有一个蛋糕应用程序 v2.3.1 在 myapp.dev:port 的 mamp v2.1.3 上本地运行(不是专业版,所以这是最新版本),当我在网站上进行分页时,我遇到了一些非常缓慢的响应(大约 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 引导插件进行分页 https://github.com/slywalker/TwitterBootstrap,如下所示:
public $helpers = array('Paginator' => array('className' => 'TwitterBootstrap.BootstrapPaginator'));
我尝试将分页的limit 设置为 1,并尝试使用 cakes 自己的分页而不是 bootstrap,但它仍然很慢。我必须对分页有所了解,因为我可以访问像 myapp.dev:port/artists/view/14532 这样的艺术家并且效果很好,所以我认为它与 sql 查询没有任何关系。
我尝试在 /etc/hosts 文件 127.0.0.1 localhost myapp.dev 和 ::1 localhost myapp.dev 中更改名称,但似乎没有任何效果。有任何想法吗?我真的被困住了。
更新:不提我的 Artist 表所具有的 hasMany 关系感到有点遗憾。这是我的 Artist 模型:
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,我发现分页器对两个左连接执行了 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 毫秒的查询速度。
我的第二个问题是为什么这两个连接会减慢它的速度?我做了一个名为artist/all 的测试视图,我在其中列出了100 位艺术家,并且我对所有连接的查询在大约40-50 毫秒内完成。
【问题讨论】:
-
使用 DebugKit 来确定实际需要这么长时间。它显示了 Timer 选项卡和 Sqllog 选项卡。一旦您知道,请告诉我们,我们可以更轻松地提供帮助。
-
嘿,戴夫,我使用了 DebugKit 并更新了我的问题。谢谢