1

実行に3〜4秒かかる複雑なクエリがあります(これより少なくすることはできません。可能な限り最適化されています)。これはページ付けされています。ただし、django-debug-toolbarを使用すると、データベースが2回「ヒット」していることに気付きました。

最初の「ヒット」はここにあります:items = paginator.page(page_number)そして少し後でif items:

クエリには3〜4秒かかりますが。これらの2つのポイントでデータベースをヒットすると、6〜7秒の推定ページロードが得られます。

これは正常ですか?2つの「ヒット」を回避し、1つのデータベース「ヒット」でのみページ付けされたアイテムを取得できますか?

これは、要求された場合の私のコードです。

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

2 に答える 2

4

これはあなたの質問に対する答えではありませんが、いくつかの所見です:

  • 最初のクエリitems = paginator.page(page_number)は、要素の数を取得することです。私はそれを次のように見ていますSELECT COUNT(*) FROM ....

  • 2番目のクエリは、オブジェクトを取得するためのクエリセット(ページ付けに渡される)の実際の評価です。クエリセットがいつ評価されるかを参照して、クエリセットはいつbool()または繰り返されるかが評価されます。したがって、クエリセットはで評価されif itemsます。ただし、アイテムを一覧表示するためにテンプレートのリストを反復処理すると、キャッシュされ、再度評価されることはありません。

したがって、これを最適化してクエリを減らす方法はないようです。

于 2012-10-09T06:48:48.340 に答える
1

これにより、クエリ全体に結果があるかどうかがチェックされます。しかし、別の意味があります。

if paginator.count:
    ....

ページネーターは常にDBを2回ヒットする必要がありますが、次のようになります。

  1. SELECT COUNT(*)....結果は_countにキャッシュされます。djangoソースの_get_count()を見てください
  2. SELECT col1、col2、.... LIMIT N

同じクエリを2回実行しないでください。

于 2012-10-09T08:03:48.607 に答える