2012-10-13 218 views
2

我正在用Django和MySQL運行一個網站,我試圖優化它。 爲此,我使用django調試工具欄,並特別關注SQL部分,我認爲這是我的頁面負載很長的原因。Django快速查詢,但渲染速度慢

當我查看django調試工具欄中的SQL部分時,它說我的查詢總共需要大約90ms。 但是,如果我把一個計時器周圍的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> 

,你可以看到,那被認爲是昂貴的代碼的唯一和平是調用該對象時所要求的SQL查詢latest_annonces_list。 但是,當我使用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)

+0

船長在這裏明顯的最快方法 - 也許你有低效的代碼在你的渲染邏輯? – Rogach

+0

嗯,我想到了它,但在模板中可能是低效的唯一的事情是查詢相關...其餘的只是由字符串組成...... – EagleOne

+0

好吧,我只是在開玩笑。問題是我們無法看到代碼就說這個問題。你能提供一個你的問題的小例子嗎? – Rogach

回答

1

90毫秒仍然是相當多的針對本地數據庫執行的查詢,所以我想有很多連接。

在這種情況下一般規律是減少由ORM用法:

大概有顯著增益要麼使用約翰尼緩存http://packages.python.org/johnny-cache/緩存查詢集或緩存輸出使用{% cache ... %}

+0

謝謝,這實際上是我做的。我嘗試了兩件事:使用nonrel數據庫(mongodB),但遷移工作太多。第二件事是擺脫ORM的使用(它太多了)。儘管如此,我會嘗試使用values和values_list。在我看來這很有趣。然而,我仍然不明白爲什麼我在查詢執行和渲染耗用時間之間有這樣的差異。哦,關於緩存,我已經使用它,但我想提高側面的性能。 – EagleOne

相關問題