0

データベース検索ごとに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ます。idcompanies_companynamecompanies_companysectorcompanies_companysub_sectorcompanies_companynum_of_employeescompanies_companyaddresscompanies_companyhome_pagecompanies_companycareer_urlcompanies_companycitycompanies_companyupdating_date, COUNT( companies_selectedusercompanies. user_id) AS num_usersFROM companies_company LEFT OUTER JOIN companies_selectedusercompanies ON ( companies_company. id= companies_selectedusercompanies. company_id) WHERE companies_company. idIN (SELECT U0. idFROM companies_company U0 LEFT OUTER JOIN companies_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 BY companies_company. idcompanies_companynamecompanies_companysectorcompanies_companysub_sectorcompanies_companynum_of_employeescompanies_companyaddresscompanies_companyhome_pagecompanies_companycareer_urlcompanies_companycitycompanies_companyupdating_dateオーダーバイcompanies_companysectorASC リミット 20 オフセット 160

11142MS:

選択しcompanies_companyます。idcompanies_companynamecompanies_companysectorcompanies_companysub_sectorcompanies_companynum_of_employeescompanies_companyaddresscompanies_companyhome_pagecompanies_companycareer_urlcompanies_companycitycompanies_companyupdating_date, COUNT( companies_selectedusercompanies. user_id) AS num_usersFROM companies_companyLEFT OUTER JOIN companies_selectedusercompanies ON ( companies_company. id= companies_selectedusercompanies. company_id) WHERE companies_company. idIN (SELECT U0. idFROM companies_company U0 LEFT OUTER JOIN companies_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 BY companies_company. idcompanies_companynamecompanies_companysectorcompanies_companysub_sectorcompanies_companynum_of_employeescompanies_companyaddresscompanies_companyhome_pagecompanies_companycareer_urlcompanies_companycitycompanies_companyupdating_dateオーダーバイcompanies_companysectorASC リミット 20 オフセット 340

4

2 に答える 2

0

これは既知の問題のようです。Facebook ルートを使用して、次のページと前のページのみを表示します。

于 2013-01-07T08:56:18.287 に答える
0

このような単純なクエリは、700 レコードに対して数ミリ秒以上かかることはありません。両方のリクエスト (ページ == 1 のリクエストとページ > 1 のリクエスト) によって生成された生の SQL クエリとそのタイミングを示してください。

データベースのインデックスは大丈夫ですか? DB クライアントを使用して両方の生の SQL クエリを実行するタイミングを確認しましたか?

于 2013-01-06T15:56:03.443 に答える