2014-01-28 73 views
3

我有一個cakephp應用程序,2.4,並且我遇到了Paginator組件的問題。首先,它不是數據庫,它絕對是解析查詢結果的執行過程。我安裝了DebugKit,可以看到我的分頁數據的mysql查詢需要整整2毫秒。該表擁有250萬條消息記錄和50萬個用戶。顯然,正確的索引是到位的。但是,控制器操作需要6167.82毫秒。所以,這裏是我的控制器行動:cakephp paginator極慢

$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。然後當蛋糕從查詢結果中構建數組時,由於我假設的額外用戶數據,它使用可容納的元素執行速度將近500毫秒。

我現在要深入研究蛋糕Paginator組件,並瞭解爲什麼它需要這麼長時間來構建響應。我希望有人能夠擊敗我,並且有一個很好的解決方案來幫助加快速度。

我的網絡服務器運行ubuntu 12.04與3gb內存,apache和mod_php與apc安裝和模型和核心緩存工作。數據庫位於單獨的服務器上。我也有一個redis服務器,它保存其他用戶數據和蛋糕會話數據。這裏有足夠的能力來解析包含大約十幾行的mysql查詢中的10條記錄。

編輯:ANSWER

作爲最早提出由伊利耶·潘迪亞還有別的東西發生,如回調,這是減緩分頁。這實際上與分頁組件無關。收件人模型具有在第三方服務的setup回調中加載sdk的行爲。該服務需要幾秒鐘才能做出響應。加載查詢中的linkedModel以過濾結果時發生這種情況。希望其他人尋找蛋糕可能表現不佳的原因也會考慮應用程序和插件中模型的回調。

+0

這種關係只是消息屬於收件人還是有更多? – arilia

+0

消息屬於發件人,收件人和MassMessage。我今天早上已經調試了大約一個小時,並且已經弄清楚了這麼久了。儘管如此,我還沒有弄清楚爲什麼。只要我知道更多,我會盡快更新。 – mneil

+0

我面臨同樣的問題。我認爲這是因爲Paginator組件需要總計數並首先使用WHERE 1 = 1進行查詢,然後按照極限「 – zeflex

回答

0

我看不出有什麼理由讓它運行緩慢。

所以這表明有一些回調安裝(無論是在模型或控制器)進行額外的處理,並誇大了行動時間這麼多。

這是假設控制器中沒有其他東西,但是你寫了什麼。

你可能實際上是measure the time的分頁調用本身,我想你會發現它非常快。所以瓶頸在代碼中的其他地方。

PS:您也可以嘗試禁用一段時間的DebugKit。在某些特定情況下,反思可能需要很長時間。

+0

」分頁。「我已經安裝了DebugKit」,這是我的問題中的第二句。該代碼是整個控制器操作。我沒有寫這整個東西,可能有一些回調隱藏在我不知道的地方。我也會檢查並更新。謝謝 – mneil

+0

我注意到你已經安裝了DebugKit,並且已經測量了查詢和操作時間。我所建議的是專門手動測量分頁時間。你可能會注意到它幾乎是即時的,所以你會知道有一些回調涉及。並嘗試禁用一個或兩個測試DebugKit,看看這是怎麼回事......我很好奇你發現了什麼! –

+0

(我建議這是因爲我不知道DebugKit實際上是如何測量動作時間的......無論有沒有回調?) –

0

爲您的應用程序安裝DebugKit。

並檢查哪個查詢需要花費太多時間。從那裏,你應該能夠跟蹤瓶頸。

+0

已安裝DebugKit。我會低估這一點,但我還沒有名聲。查詢不是很慢。 2MS。 – mneil