2012-05-30 37 views
0

我有以下型號:如何在Django中優化此order_by查詢?

class Movie(models.Model): 
    item = models.OneToOneField(Item, primary_key=True) 

class Item(models.Model): 
    ... 

class Popularity(models.Model): 
    item = models.OneToOneField(Item, primary_key=True) 
    today = models.IntegerField(default=0, db_index=True) 

我想執行以下查詢:

movies = Movie.objects.order_by('-item__popularity__today') \ 
         .values(...) 
paginator = Paginator(movies, 12) 

然而,與數據庫中的大約52000行,這需要500-700ms運行。有什麼辦法可以讓這個更快嗎?我想要做的是獲得數據庫中最流行的12部電影。

+0

嘗試[限制](https://docs.djangoproject.com/en/dev/topics/db/queries/#limiting-querysets)將QuerySet設置爲12個元素。 – Salem

+0

'today'字段如何工作?如果它基本上是一個布爾值,你應該能夠首先過濾查詢集,例如:Movie.objects.filter('item__popularity__today'= 1)'如果不是,可能還有另一種方法來先過濾它('item__popularity__today__gt'= 0',也許?) – Hannele

+0

如果直接對數據庫運行結果查詢,需要多長時間? –

回答

1

這不是你可以在Django中做的事情。在數據庫中優化這個方法。

針對實際生成的查詢運行EXPLAIN - 實際上,Django調試工具欄可以爲您執行此操作 - 並注意相關的子查詢和JOIN是否使用索引而不是全表掃描。您可能需要爲item, today上的Paginator表創建索引以開始。