2

Django と MySQL を使用して Web サイトを運営しており、最適化を試みています。その目的のために、私は django デバッグ ツールバーを使用し、SQL 部分に特に注意を払います。これが、ページの読み込みが長い理由だと思います。

django デバッグ ツールバーの SQL 部分を見ると、クエリに合計で約 90 ミリ秒かかることが示されています。しかし、Python でレンダリング関数の周りにタイマーを配置すると、3 秒以上かかります (これは、ページをリロードするときに実際に表示されるものに近いです)...

レンダリングに比べてクエリが高速なのはなぜですか?

編集:これは、テンプレートのコードを最大限に簡略化したものです:

<div id="content_annonces" class="ui-widget ui-corner-all">
     <table>
         {% if latest_annonces_list %}
             here goes the content
         {% else %}
             nothing found
         {% endif %}
     </table>
</div>

ご覧のとおり、コストがかかると思われる唯一のコードは、オブジェクト latest_annonces_list を呼び出すときに要求される SQL クエリです。しかし、djangoデバッグツールバーでプロファイリングすると、このクエリは90ミリ秒経過し、レンダリングには約3秒かかります...

そして、latest_annonces_list の内容は次のとおりです。

result = Annonce.objects.select_related('vehicule', 'vehicule__marque')
         .filter(vehicule__marque__in=self.marques).order_by('prix')[:10]

モデルはこちら:

class Marque(models.Model):
    name = models.CharField(db_index=True, primary_key=True, max_length=100)

class Vehicule(models.Model):
    modele     = models.CharField(primary_key=True, db_index=True, max_length=100)
    gen_modele = models.CharField(db_index=True, max_length=100)
    marque     = models.ForeignKey(Marque)
    categories = models.ManyToManyField(Categorie)
    click      = models.PositiveIntegerField(default=0)

class Annonce(models.Model):
    vehicule      = models.ForeignKey(Vehicule, db_index=True)
    porte         = models.ForeignKey(Porte, db_index=True)
    carburant     = models.ForeignKey(Carburant, db_index=True)
    bv            = models.ForeignKey(Boite, db_index=True)
    prix          = models.DecimalField(db_index=True,max_digits=8, decimal_places=2)
    km            = models.PositiveIntegerField(db_index=True)
    dpt           = models.CharField(db_index=True, max_length=50)
    annonceur     = models.ForeignKey(Annonceur, db_index=True)
    img           = models.URLField()
    url           = models.URLField(max_length=2000)
    finition      = models.CharField(max_length=500)
    cylindree     = models.CharField(max_length=500)
    moteur        = models.CharField(max_length=500)
    annee         = models.DateTimeField(u'annee vehicule', db_index=True)
    pub_date      = models.DateTimeField(u'date publication')
    last_touched  = models.DateTimeField(u'derniere modification')
    last_scan     = models.DateTimeField(u'dernier scan')
    type_ann      = models.ForeignKey(Type_Annonce, db_index=True)
    type_vendeur  = models.ForeignKey(Vendeu

r、db_index = True)

4

1 に答える 1

1

90 ミリ秒は、ローカル データベースに対して実行されたクエリの場合でもほとんどなので、多くの結合があると思います。

このような状況での一般的なルールは、ORM の使用を次のように減らすことです。

おそらく、大幅な利益を得るための最も簡単な方法は、johnny-cache http://packages.python.org/johnny-cache/を使用してクエリセットをキャッシュするか、次を使用して出力をキャッシュすることです。{% cache ... %}

于 2012-10-13T15:29:18.033 に答える