2

我正在使用 Django 和 MySQL 运行一个网站,并且正在尝试对其进行优化。为此,我使用了 django 调试工具栏,并特别注意了 SQL 部分,我认为这是我的页面加载时间长的原因。

当我查看 django 调试工具栏中的 SQL 部分时,它说我的查询总共需要大约 90 毫秒。但是如果我在python中的渲染函数周围放了一个计时器,那么它需要超过3s(这更接近我在重新加载页面时实际看到的)......

与渲染相比,查询为何如此之快?

编辑:这是模板中的代码简化到最大:

<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 回答