2016-12-23 28 views
3

比方說,我想獲取返回大約10k條記錄的查詢的最後50條記錄,並將其放在一個包含1M記錄的表中。我可以做(在訂貨的計算成本):我應該在切分前N個記錄之前顛倒查詢集的順序,還是將其計數以切分最後N個記錄?

data = MyModel.objects.filter(criteria=something).order_by('-pk')[:50] 

我也能做到(在成本的2次數據庫的訪問):

# assume I don't care about new records being added between 
# the two queries being executed 
index = MyModel.objects.filter(criteria=something).count() 
data = MyModel.objects.filter(criteria=something)[index-50:] 

這是隻是一個普通的關係型數據庫更好沒有索引criteria(例如postgres在我的情況下,沒有列表存儲或任何幻想)?最重要的是,爲什麼?

如果表或查詢集顯着更大(例如10M行表中的10萬條記錄),答案會改變嗎?

+0

當您使用'.filter'時,Django是否強加一個有意義的順序?通常,在SQL數據庫中,如果使用'order by'或其等價物,*最後50行*僅有意義。再次運行相同的查詢可能不會以相同的順序返回行。 –

+0

我在創建儀表板的環境中問這個問題,我只想顯示一些合理的最近的客戶評論。訂貨嚴格性對於這種特殊情況並不重要。 – Escher

+0

*在沒有「order by」或其等價物的情況下,合理的近期*也沒有意義。 –

回答

5

這一次將是非常緩慢的

data = MyModel.objects.filter(criteria=something)[index-50:] 

爲什麼?因爲它轉換成

SELECT * FROM myapp_mymodel OFFEST (index-50) 

你是不是在這裏執行任何訂貨,所以服務器將不得不calulcate結果設置並跳到結尾,這將涉及大量的閱讀,並且會非常緩慢。讓我們不要忘記count()查詢也不是那麼熱。

OTH,這一次將是快速

data = MyModel.objects.filter(criteria=something).order_by('-pk')[:50] 

你在主鍵反向排序與

data = MyModel.objects.filter(criteria=something).order_by('pk')[:50] 
獲得第50和第50,你可以獲取同樣迅速

所以這就是你應該做的

data1 = MyModel.objects.filter(criteria=something).order_by('-pk')[:50] 
data2 = MyModel.objects.filter(criteria=something).order_by('pk')[:50] 

在primar y鍵很低。

相關問題