データベース検索ごとに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_users
FROMcompanies_company
LEFT OUTER JOINcompanies_selectedusercompanies
ON (companies_company
.id
=companies_selectedusercompanies
.company_id
) WHEREcompanies_company
.id
IN (SELECT U0.id
FROMcompanies_company
U0 LEFT OUTER JOINcompanies_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 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
。sector
ASC リミット 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_users
FROMcompanies_company
LEFT OUTER JOINcompanies_selectedusercompanies
ON (companies_company
.id
=companies_selectedusercompanies
.company_id
) WHEREcompanies_company
.id
IN (SELECT U0.id
FROMcompanies_company
U0 LEFT OUTER JOINcompanies_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 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
。sector
ASC リミット 20 オフセット 340