2017-01-19 67 views
0

的數據庫負載,我決定去看看到數據庫使用情況SilverStripe爲我建立一個相當大的網站,並希望確保它可以正確縮放。簡單的頁面

我有一個頁面,多數民衆贊成在此刻很簡單,但理解有一些查詢來構建它。我打開了我的數據庫日誌記錄來查看正在請求的內容。

,我認爲可能是有問題的(那些我)的查詢是不是經常,但數據庫中有大約50查詢與此類似:

SELECT conname,pg_catalog.pg_get_constraintdef(r.oid, true) 
FROM pg_catalog.pg_constraint r WHERE r.contype = 'c' AND conname = $1 ORDER BY 1; 

約10查詢該SiteTree約10或會員。現在,這不是一個問題,但如果每個頁面加載大約100個查詢(還有其他的查詢),我將在啓動時遇到一些問題。

請告訴我造成所有這些疑問?我能做些什麼來降低它們,特別是上面的那個。

而且,如果我做的:

$data = DataObject::get()->filter('field1' => 'value1'); 
if ($data->exists()) { 
    $one = $data->filter('field2' => 'value2'); 
    // do something 
    $two = $data->filter('field2' => 'value3')->First(); 
    echo $two->Has_One_Field()->Field //accessing a has_one relationship 
    //do something 
} 

這會否導致4個疑問或只是一個和其他兩個過濾器只搜索DataList這就是已經生產出來的?

+0

聽起來很像我過早的優化。您是否確定/測試過這些查詢是性能瓶頸? – bummzack

+0

@bummzack不,但我發現如果性能留到最後,你可能會造成效率低下。 – Rudiger

回答

3

首先,當您登錄成爲會員,這些會員查詢被執行。如果您未登錄,那麼這些查詢將不會被執行,這樣可以爲您節省10個查詢。

你的第二個問題,每個新添加的過濾器,只會返回一個新的DataList,而不是實際執行最終的查詢,直到你呼應他們。雖然你的例子不起作用,因爲$ 2是一個DataList,而不是DataObject。要得到實際的物品,你需要做$two->HasOneObject()->Field,但是不要。

爲了降低這些查詢,你可以考慮緩存。但說實話,我不應該太擔心。數據庫意味着這種事情。如果你實際上將它們作爲PHP中的對象加載,那麼問題會變得更糟,因爲它會開始吃內存。

另一種選擇是擴展頁面,並將某些查詢的結果緩存到變量ArrayList對象中,以便可以從內存中過濾它們。從理論上講,這樣做速度更快,但要求PHP做更多的工作,這會讓事情變得緩慢。

+0

對不起,我更新了這個查詢,這只是爲了表明我在做什麼。根據你對第二個問題所說的話,exists()會觸發一個請求,對$ 1進行過濾(取決於我對它的處理)會觸發第二個請求,然後$ 2會觸發第三個請求回聲。是對的嗎? – Rudiger

+0

另外,我必須忍受的成員查詢,因爲用戶在該階段登錄,但對於第一個查詢,我真的不明白爲什麼有50個幾乎相同的查詢。 – Rudiger

+0

是的,存在會執行第一個請求。然後最後的兩美元會做第二次請求。 –