2012-10-09 58 views
1

我有一個複雜的查詢,需要3-4秒才能執行(不能少一點,它儘可能優化)。這是分頁。但是,使用django-debug-toolbar我注意到數據庫是兩次「命中」。django複雜查詢命中分貝兩次,雖然分頁。

第一「重災區」在這裏:在if items:

items = paginator.page(page_number)再晚了一點。雖然查詢需要3-4秒。在這兩點擊中數據庫,我估計頁面負載爲6-7秒。

這是正常的嗎?我是否可以避免這兩個'命中'並僅在一個數據庫'命中'中檢索分頁項目?

這是我的情況下,代碼要求:

paginator = Paginator(tips, PAGE_ITEMS) 
items = paginator.page(page_number) 
if items: 
    offset = items.object_list[0] 
else: 
    offset = None 
+0

它做兩次相同的查詢嗎? – Rohan

+0

否。第二次查詢是'SELECT A FROM B'時,第一次是'SELECT COUNT(*)FROM(SELECT A FROM B)'。唯一的區別是對象的計數 – xpanta

回答

2

這不是一個回答你的問題,但一些觀察:

  • 第一個查詢items = paginator.page(page_number)是讓元素的數量。我將其視爲SELECT COUNT(*) FROM ....

  • 第二個查詢是對查詢集(即傳遞給分頁)的實際評估以檢索對象。參照when querysets evaluated,查詢集在bool()或迭代時進行評估。所以queryset將在if items進行評估。但是,當您遍歷模板中的列表以列出項目時,它將被緩存並且不會再次評估。

所以似乎沒有辦法來優化和減少查詢。

1

這將檢查整個查詢是否有任何結果。但具有不同的含義:

if paginator.count: 
    .... 

的分頁程序總是需要打DB的兩倍,但這樣的:

  1. SELECT COUNT(*)......結果在_count緩存。看看_get_count()在Django的源
  2. SELECT COL1,COL2,...... LIMITñ

同樣的查詢不應該做兩次。