2013-01-06 71 views
0

我想在每個數據庫搜索中擊中DB一次。django分頁並對大型查詢集進行排序

用戶可以查詢數據庫,然後對結果進行分頁和排序。

該數據庫包含700個項目。

django-debug-toolbar顯示有時查詢時間太長。

當前我保存會話中的初始搜索結果id並使用它來構建查詢集以對結果進行排序和分頁。

我想避免這個數據庫查詢。

我正在考慮緩存查詢集,以便其他用戶可以使用緩存的查詢集而不是擊中數據庫。

您對這種方法有什麼看法? 有沒有我想念的東西?

companiesID = request.session['selectedCompaniesIDs'] 

companies = Company.objects.filter(pk__in=companiesID).order_by(type).annotate(num_users=Count('users')) 

cd = create_pagination(companies, page) 
    PAGINATION_RESULTS_PER_PAGE = 20 

def create_pagination(results, page): 
    paginator = Paginator(results, PAGINATION_RESULTS_PER_PAGE) 

    try: 
     res = paginator.page(page) 
    except PageNotAnInteger: 
     # If page is not an integer, deliver first page. 
     res = paginator.page(1) 
    except EmptyPage: 
     # If page is out of range (e.g. 9999), deliver last page of results. 
     res = paginator.page(paginator.num_pages) 

    return res 

1 MS:

SELECT companies_companyidcompanies_companynamecompanies_companysectorcompanies_companysub_sectorcompanies_companynum_of_employeescompanies_companyaddress, companies_companyhome_pagecompanies_companycareer_urlcompanies_companycitycompanies_companyupdating_date, COUNT(companies_selectedusercompaniesuser_id)AS num_users FROM companies_company LEFT OUTER JOIN companies_selectedusercompanies ON(companies_companyid = companies_selectedusercompaniescompany_id)WHERE companies_companyid IN(SELECT U0。id FROM companies_company U0 LEFT OUTER JOIN companies_selectedusercompanies U1 ON(U0。id = U1。company_id)GROUP BY U0。id,U0。name,U0。sector, U0。sub_sector,U0。num_of_employees, U0。address,U0。home_page, U0。career_url,U0。city,U0。updating_date ORDER BY NULL)GROUP BY companies_companyidcompanies_companynamecompanies_companysectorcompanies_companysub_sectorcompanies_companynum_of_employeescompanies_companyaddress, companies_companyhome_pagecompanies_companycareer_urlcompanies_companycitycompanies_companyupdating_date ORDER BY companies_companysector ASC LIMIT 20 OFFSET 160

11142 MS:

SELECT companies_companyidcompanies_companynamecompanies_companysectorcompanies_companysub_sectorcompanies_companynum_of_employeescompanies_companyaddress, companies_companyhome_pagecompanies_companycareer_urlcompanies_companycitycompanies_companyupdating_date, COUNT(companies_selectedusercompaniesuser_id)AS num_users FROM companies_company LEFT OUTER JOIN companies_selectedusercompanies ON(companies_companyid = companies_selectedusercompaniescompany_id)WHERE companies_companyid IN(SELECT U0。id FROM companies_company U0 LEFT OUTER JOIN companies_selectedusercompanies U1 ON(U0。id = U1。company_id)GROUP BY U0。id,U0。name,U0。sector, U0。sub_sector,U0。num_of_employees, U0。address,U0。home_page, U0。career_url,U0。city,U0。updating_date ORDER BY NULL)GROUP BY companies_companyidcompanies_companynamecompanies_companysectorcompanies_companysub_sectorcompanies_companynum_of_employeescompanies_companyaddress, companies_companyhome_pagecompanies_companycareer_urlcompanies_companycitycompanies_companyupdating_date ORDER BY companies_companysector ASC LIMIT 20 OFFSET 340

+0

如果您的數據庫只有700個項目,並且每次查詢頁面時都需要很長時間才能查詢,那麼查詢就會出現嚴重錯誤。 –

+0

結果可以在幾秒鐘內返回,幾秒鐘後返回。 我可以;噸數是什麼使這種變化。 – DjangoPy

+0

這種情況發生在我分頁到頁面= 1時。 queryset相等。 不同的是:paginator。頁面(頁) – DjangoPy

回答

0

似乎這是一個已知的問題。 我將採取Facebook路線,只顯示下一頁和上一頁。

+0

問題在於註釋(num_users = Count('users')) 當用戶分頁時,這不會改變。 什麼是最好的方式來保持它之間的網頁,而不是每次計算它? – DjangoPy

0

對於700條記錄,這樣一個簡單的查詢不應超過幾個ms。 請向我們展示由這兩個請求(頁面== 1和頁面大於1的請求)生成的原始SQL查詢及其時間。

您的數據庫索引是否正常?您是否檢查過使用您的數據庫客戶端執行兩個原始sql查詢的時間?

+0

我編輯了初始線程。 – DjangoPy

+0

有什麼幫助......? – DjangoPy

相關問題