【问题标题】:Mamp extremely slow with CakePHPCakePHP 的 Mamp 速度极慢
【发布时间】: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_surnamesartist_fornames 并忽略两个名为 artist.activesartist_monogram 的表,它们一起减慢了 4000 毫秒的查询速度。

我的第二个问题是为什么这两个连接会减慢它的速度?我做了一个名为artist/all 的测试视图,我在其中列出了100 位艺术家,并且我对所有连接的查询在大约40-50 毫秒内完成。

【问题讨论】:

  • 使用 DebugKit 来确定实际需要这么长时间。它显示了 Timer 选项卡和 Sqllog 选项卡。一旦您知道,请告诉我们,我们可以更轻松地提供帮助。
  • 嘿,戴夫,我使用了 DebugKit 并更新了我的问题。谢谢

标签: php cakephp mamp


【解决方案1】:

TLDR:

  1. $recursive 设置为-1
  2. 使用CakePHP's Containable Behavior 仅检索您想要的关联数据

代码示例:

//wherever you set this variable
$paginate = array(
    'recursive' => -1,
    'limit' => 50,
    'order' => array('Artist.id' => 'desc'),
    'contain' => array(
        'ArtistSurname',
        'ArtistForName'
    )
);

记得查看 Containable 的文档 - 它解释了如何将模型设置为 $actsAs Containable,将递归设置为 -1...等等。

我建议在您的 AppModel 中实际设置 public $recursive=-1'public $actsAs =array('Containable'); - 这样所有模型都已设置好并随时可以使用 Containable。此外,任何高于 -1 的递归都是不好的恕我直言 - Containable 在各个方面都好得多。

【讨论】:

  • 感谢戴夫,做到了!不过,不必设置 $recursive 。任何想法为什么查询在分页器中花费这么长时间但在我看来一切正常?
  • 我在编辑我的帖子时失去了互联网,所以我不确定你接受的答案是什么 - 希望我的版本是正确的 :)
  • 我对缓慢的假设是缺少或不正确的表索引。
  • 第一个答案有点模糊,但我通过文档弄清楚了,我的解决方案正是你现在发布的,所以它是正确的:)。
  • 很高兴听到这个消息!这是一个对表索引进行一些解释的链接。它说诸如“您可以加快速度”之类的内容,但实际上,我已经看到,仅通过向表中添加正确的索引,对未索引表的 3-4 秒以上的查询就减少到了 0.01 秒。 tizag.com/mysqlTutorial/mysql-index.php
猜你喜欢
  • 2013-10-11
  • 2015-07-22
  • 1970-01-01
  • 2011-03-30
  • 2015-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多