2012-11-10 72 views
1

我在Django QuerySet中調用annotate時遇到了一些性能問題。讓我用一個例子來解釋我的問題。說我在我的模型,這樣的外鍵關係:Django - 通過註釋提高查詢集的性能

def Blog(models.Model): 
    owner = models.ForeignKey(User) 
    title = models.CharField() 

def BlogArticle(models.Model): 
    blog = models.ForeignKey(Blog) 
    title = models.CharField() 
    body = models.CharField() 
    timestamp = models.DateTimeField() 

現在,說我想的基礎上,博客文章的時間戳的最後10個更新博客的列表。我能做到這一點有:

latest_updates = Blog.objects.annotate(updated=Max('blogarticle__timestamp')).order_by('-updated')[:10] 

這工作,但速度很慢與MySQL有大量的數據(剖析查詢顯示「複製到tmp下表」一步走很長的時間,但這是另一個話題)。

到目前爲止,我認爲以下幾點:

  • 添加一個「更新」 DateTimeFieldBlog並添加一個信號或save覆蓋,以保持這一領域的同步與該Blog最新BlogArticle。這對性能會很好,但是違背了DRY原則。
  • 查詢最近10次更新的BlogArticle型號,並使用它查詢Blog型號。但是,只有在最近10次更新全部來自不同的博客時,這纔會起作用。

任何其他想法來優化此查詢?

回答

3

嘗試添加廣告索引時間戳列:

timestamp = models.DateTimeField(db_index=True) 

HTH