データベース検索ごとにDBに1回ヒットしたい。
ユーザーはデータベースにクエリを実行し、結果をページ分割して並べ替えることができます。
データベースには 700 項目が含まれています。
django-debug-toolbar は、クエリに時間がかかりすぎる場合があることを示しています。
現在、最初の検索結果 ID をセッションに保存し、これを使用してクエリセットを作成し、結果を並べ替えてページ分割します。
この db クエリを回避したい。
他のユーザーがキャッシュされたクエリセットを使用し、データベースにアクセスしないように、クエリセットをキャッシュすることを考えていました。
このアプローチについてどう思いますか?私が見逃しているものはありますか?
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
1MS:
選択し
companies_companyます。id、companies_company。name、companies_company。sector、companies_company。sub_sector、companies_company。num_of_employees、companies_company。address、companies_company。home_page、companies_company。career_url、companies_company。city、companies_company。updating_date, COUNT(companies_selectedusercompanies.user_id) ASnum_usersFROMcompanies_companyLEFT OUTER JOINcompanies_selectedusercompaniesON (companies_company.id=companies_selectedusercompanies.company_id) WHEREcompanies_company.idIN (SELECT U0.idFROMcompanies_companyU0 LEFT OUTER JOINcompanies_selectedusercompaniesU1 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_dateORDER BY NULL) GROUP BYcompanies_company.id、companies_company。name、companies_company。sector、companies_company。sub_sector、companies_company。num_of_employees、companies_company。address、companies_company。home_page、companies_company。career_url、companies_company。city、companies_company。updating_dateオーダーバイcompanies_company。sectorASC リミット 20 オフセット 160
11142MS:
選択し
companies_companyます。id、companies_company。name、companies_company。sector、companies_company。sub_sector、companies_company。num_of_employees、companies_company。address、companies_company。home_page、companies_company。career_url、companies_company。city、companies_company。updating_date, COUNT(companies_selectedusercompanies.user_id) ASnum_usersFROMcompanies_companyLEFT OUTER JOINcompanies_selectedusercompaniesON (companies_company.id=companies_selectedusercompanies.company_id) WHEREcompanies_company.idIN (SELECT U0.idFROMcompanies_companyU0 LEFT OUTER JOINcompanies_selectedusercompaniesU1 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_dateORDER BY NULL) GROUP BYcompanies_company.id、companies_company。name、companies_company。sector、companies_company。sub_sector、companies_company。num_of_employees、companies_company。address、companies_company。home_page、companies_company。career_url、companies_company。city、companies_company。updating_dateオーダーバイcompanies_company。sectorASC リミット 20 オフセット 340