2011-08-21 61 views
0

我有一個使用通用的關係非常基本的「新聞源」頁,以下模型:減少數據庫查詢最近的一個活動

class RecentActivity(models.Model): 
    event_type = models.IntegerField(choices=EVENT_TYPES) 
    timestamp = models.DateTimeField() 
    content_type = models.ForeignKey(ContentType) 
    object_id = models.PositiveIntegerField() 
    content_object = generic.GenericForeignKey('content_type', 'object_id') 
    credits = models.ManyToManyField('videos.VideoCredit', blank=True) 

我使用信號來聽一個對象被創建時並在顯示之前檢查以確保其存在(即,它未被刪除)。這是一個非常基礎的頁面,只有幾十行代碼可以生成它。但是,它正在生成大量的db查詢!在大約20個最近活動對象的頁面上,大約需要120個查詢,我估計它最多可以處理大約200個查詢。

解決此問題的最佳方法是什麼?我主要關心的不是減少查詢次數,而是儘可能快地加載頁面。 (我的第一個想法是反規範化)。

請注意,該頁面並非每個用戶都是動態的,但對所有用戶都是一樣的。謝謝。

回答

3

很難說沒有更多的信息,但我採取通常的步驟是:

  1. 使用django-debug-toolbar找出到底哪些查詢正在運行
  2. 使用select_related上正由以下外鍵導致查詢
  3. 將{%with%}用於由模板中的多次訪問生成的查詢。

看着你的模型,你可能訪問的是content_type,然後是內容對象。如果您完全遵循學分,您可以輕鬆實現這一數量的查詢。

+0

感謝您的回覆。你會建議改變表 - 例如沒有一個字段的「credits」,而不是在視圖中爲它創建一個字典 – David542

+0

很難說,我有許多領域的許多領域,並根據他們的應用程序或者不是性能問題或我的存在的禍根。一般來說,最好花一些時間來優化查詢,然後重新修改數據庫的性能;數據庫往往足夠快,如果你只是在工作。 –

0

絕對使用django-debug-toolbar查看正在執行的查詢,並確保查詢數量不會隨着顯示的元素對象數量線性增長。

一旦最大限度地減少了查詢次數,請嘗試使用Django緩存系統並緩存導致緩慢的視圖或模板片段。