2013-05-22 250 views
0

我有一個Cake Application v2.3.1在mamp v2.1.3上運行(不是親,所以這是最新版本)myapp.dev:port,我遇到一些非常慢的響應,當我有網站(約5秒)上的分頁,這是我在控制器代碼:CakePHP極慢的緩慢

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並嘗試使用蛋糕自己的分頁代替bootstrap,但它仍然非常慢。我必須是分頁的東西,因爲我可以像myapp.dev:port/artists/view/14532訪問一個藝術家,這很好,所以我不認爲它與SQL查詢有任何關係。

我試着改變/ etc/hosts文件中的名稱127.0.0.1 localhost myapp.dev::1 localhost myapp.dev,但似乎沒有任何效果。有任何想法嗎?我很困難。

更新:感覺有點不好,因爲不提及我的藝術家表具有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,我發現分頁程序做2個不必要querys兩個左聯接兩個大約需要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的表,這兩個表一起以4000ms的速度降低查詢速度。

這裏我的第二個問題是爲什麼這兩個連接減慢了這麼多?我做了一個名爲artists/all的測試視圖,其中我列出了100位藝術家,在那裏我的查詢與所有聯接都在40-50ms左右完成。

+0

使用DebugKit來確定實際需要這麼長時間。它顯示了一個Timer選項卡以及一個Sqllog選項卡。一旦你知道,讓我們知道,我們可以幫助更輕鬆。 – Dave

+0

嘿Dave,我使用了DebugKit並更新了我的問題。謝謝 – bangerang

回答

3

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' 
    ) 
); 

記住通過對中可容納的文檔看 - 它解釋如何模型(S)設置爲$actsAs中容納,遞歸設置爲-1 ...等等等等

我建議實際上是在設置public $recursive=-1'public $actsAs =array('Containable');都你的AppModel - 這樣,所有模型都可以設置,並隨時隨地使用Containable。此外,任何高於-1的遞歸是不好的恕我直言 - 在每個方面可以包容更好。

+0

謝謝戴夫,這樣做!雖然沒有設置$遞歸。任何想法爲什麼這些查詢在paginator中花費很長時間,但在我看來都很好? – bangerang

+0

我在編輯帖子時丟失了互聯網,所以我不確定我接受的答案是什麼 - 希望我的版本是正確的:) – Dave

+0

我對緩慢的假設是缺乏或不正確的表索引。 – Dave