Django 數據庫訪問性能優化

  1. 使用標準的數據庫優化技術:數據庫

    在進行Django數據庫訪問性能優化以前,首先應該使用標準的數據庫技術對其進行優化,好比給字段加索引,經過使用 django.db.models.Field.db_index 來給一個Django模型類的字段加索引,設置這個屬性字段的Field.db_index=Truedjango

    注:django對model中的fkunique = True的字段將自動建立索引。緩存

  2. 理解Django中QuerySet的工做機制對數據庫訪問優化相當重要:性能優化

    QuerySet是懶加載的,它只有在須要的時候纔會被執行,而且會將執行的結果保存在內存中。函數

  3. 理解Django中QuerySet的緩存機制:性能

    QuerySet對調用方法是不執行緩存的。好比下面的兩端代碼,其中一個會被緩存,另外一個不會:優化

    >>> entry = Entry.objects.get(id=1)
    
    >>> entry.blog # Blog對象會被從數據庫查詢出來
    
    >>> entry.blog # 第二次訪問的緩存對象,不會再次執行查詢

    可是對於調用的查詢方法,是不會被緩存的:code

    >>> entry = Entry.objects.get(id=1)
    
    >>> entry.authors.all() # 第一次會執行查詢
    
    >>> entry.authors.all() # 第二次會再執行一次查詢
  4. 使用模板語言中的with標籤:對象

    在視圖模板中,針對QuerySet對象使用with標籤,可讓數據被緩存起來使用。blog

  5. 使用iterator()方法:

    對於緩存的QuerySet使用iterator()方法。

  6. 將查詢計算操做放在數據庫中完成,不要在Python代碼中完成。

    1. 使用filter,exclude完成查詢過濾;

    2. F()查詢表達式;

    3. 使用聚合函數來完成數據庫聚合操做。

  7. 使用QuerySet.extra()明確的指出要查詢的字段。

  8. 對於複雜的數據庫查詢操做,使用原生SQL實現。

  9. 儘可能一次查詢出全部須要的信息。

  10. 只查詢須要的數據:

    1. 某些狀況下,只使用 QuerySet.values()values_list()方法,查詢出符合條件的結果集而不是完整的對象結果集;

    2. 某些狀況下,只使用 QuerySet.defer()only()過濾數據。

  11. 若是隻是查詢集合的數量,使用QuerySet.count()函數,而不是len(QuerySet)

  12. 若是想知道某個記錄是否包含在某個結果集中,使用 QuerySet.exists()函數;

  13. 避免過多的使用 count()exists() 函數;

  14. 對於批量更新和刪除操做使用 QuerySet.update()QuerySet.delete()

  15. 理解 QuerySet.select_related() 方法:

    select_related()會在查詢過程當中儘可能深刻的查詢關聯數據,這樣在須要查詢大量外鍵的數據時很是有用,如:

    >>> e=Entry.objects.get(id=5) #這部操做會查詢數據庫
    
    >>> b=e.blog #該操做會再次查詢數據庫

    而採用select_related()查詢的效果是:

    >>> e=Entry.objects.select_related().get(id=5) #這步操做會查詢數據庫
    
    >>> b=e.blog #不會再次查詢數據庫
  16. 若是須要查詢對象的外鍵,則使用外鍵字段而不是使用關聯的對象的主鍵,好比:

    >>> entry.blog_id #應該使用這種方式
    
    >>> entry.blog.id #不要使用這種方式
相關文章
相關標籤/搜索