2012-09-07 53 views
0

我遇到了頁面加載速度的問題。優化Django

現在加載頁面大約需要7秒,Django處理需要2〜3秒。

顯而易見的一點是,我缺乏體系結構知識,在訪問頁面時執行平均50個查詢,如「Django調試工具欄」所示,但大多數查詢類似於「昨天的快照」 )「或」每日快照(按某事物分組)「,並且不必每次更新。

我想出了使用內存緩存的想法或爲可能的數據類型創建新表。

這種問題是否有任何約定或設計模式?

樣本查詢是這些(我相信他們不應該在昨天的數據或最後month`s數據每次查詢):

SELECT `sample_salestarget`.`id`, `sample_salestarget`.`country_id`,     `sample_salestarget`.`year`, `sample_salestarget`.`month`, `sample_salestarget`.`sales` FROM `sample_salestarget` WHERE (`sample_salestarget`.`country_id` = "abc" AND `sample_salestarget`.`month` = 8 AND `sample_salestarget`.`year` = 2012) 

SELECT `sample_dailysummary`.`id`, `sample_dailysummary`.`country_id`, `sample_dailysummary`.`date`, `sample_dailysummary`.`pv_day`, `sample_dailysummary`.`pv_week`, `sample_dailysummary`.`pv_month`, `sample_dailysummary`.`active_uu_day`, `sample_dailysummary`.`active_uu_week`, `sample_dailysummary`.`active_uu_month`, `sample_dailysummary`.`active_uu_7days`, `sample_dailysummary`.`active_uu_30days`, `sample_dailysummary`.`paid_uu_day`, `sample_dailysummary`.`paid_uu_week`, `sample_dailysummary`.`paid_uu_month`, `sample_dailysummary`.`sales_day`, `sample_dailysummary`.`sales_week`, `sample_dailysummary`.`sales_month`, `sample_dailysummary`.`register_uu_day`, `sample_dailysummary`.`register_uu_week`, `sample_dailysummary`.`register_uu_month`, `sample_dailysummary`.`pay_count_day`, `sample_dailysummary`.`pay_count_week`, `sample_dailysummary`.`pay_count_month`, `sample_dailysummary`.`total_user`, `sample_dailysummary`.`inv_access_uu`, `sample_dailysummary`.`inv_sender_uu`, `sample_dailysummary`.`inv_accepted_uu`, `sample_dailysummary`.`inv_send_count`, `sample_dailysummary`.`memo`, `sample_dailysummary`.`first_charge_uu` FROM `sample_dailysummary` WHERE `sample_dailysummary`.`date` = 2012-09-07 AND `sample_dailysummary`.`country_id` = "abc") 
+0

我假設你讓Django爲你做所有的查詢?因爲'group by'有時候會很慢,一般 –

+1

給我們展示一些代碼 –

+1

這是*無處*附近有足夠的信息來幫助你,但是我可以說你犯了無數錯誤。調試工具欄顯示的加載時間僅與其他視圖或同一視圖的其他迭代的上下文有關,* not *,並且我重複*與您的頁面的總體真實速度無關。調試工具欄減慢了處理過程並顯着提高了*。使用調試工具欄加載7秒鐘的頁面可能需要不到一秒的時間。 –

回答

2

使用Memcached真的可以加快速度爲您服務。但是,這確實伴隨着問題。必須在動態頁面上特別小心,以便在需要時明確使緩存無效。

隨着Memcached的,儘量johnny-cache這確實緩存你的Django ORM的一個很好的工作查詢

此外,利用Django's session variables儘可能。 (如果您使用Memcached,請嘗試cached_db會話引擎。)您可以保存在整個會話中保持一致的對象(如您的用戶配置文件設置)。這樣你就可以再次減少sql調用次數。

如果你確實需要快速頁面加載..也許嘗試加載你的頁面,然後使用Celery異步調用你的SQL語句並以AJAXy方式加載你的結果。

+0

Thanks.I將嘗試緩存,會話中間件和芹菜(我的最愛)! – suslov

2

如果這是一個生產應用程序暴露於互聯網,而你不能減少你所做的查詢數量,那麼你至少應該重用這些答案,我會建議使用django內置的數據庫緩存來將數據庫結果存儲在使用memcached的RAM中。如果這是一個本地應用程序,那麼我會建議django的基於內存的緩存。這樣做的原因是memcached是能夠比Django的,但Django的進一步縮小了很多需要很少的設置

Caching for Django

+0

Thanks.My應用程序在互聯網上暴露。我可以使用redis而不是memcached進行數據庫緩存嗎? – suslov

+0

從來沒有使用Redis,但Django支持memcached開箱即用。 – Jharwood