1. 使用標準的資料庫優化技術:
在進行django資料庫訪問效能優化之前,首先應該使用標準的資料庫技術對其進行優化,比如給字段加索引,通過使用 django.db.models.field.db_index 來給乙個django模型類的字段加索引,設定這個屬性欄位的field.db_index=true。
注:django對model中的fk和unique = true的字段將自動建立索引。
2. 理解django中queryset的工作機制對資料庫訪問優化至關重要:
queryset是懶載入的,它只有在需要的時候才會被執行,並且會將執行的結果儲存在記憶體中。
3. 理解django中queryset的快取機制:
queryset對呼叫方法是不執行快取的。比如下面的兩端**,其中乙個會被快取,另乙個不會:
>>> entry = entry.objects.get(id=1)
>>> entry.blog # blog物件會被從資料庫查詢出來
>>> entry.blog # 第二次訪問的快取物件,不會再次執行查詢
但是對於呼叫的查詢方法,是不會被快取的:
>>> entry = entry.objects.get(id=1)
>>> entry.authors.all() # 第一次會執行查詢
>>> entry.authors.all() # 第二次會再執行一次查詢
4. 使用模板語言中的with標籤:
在檢視模板中,針對queryset物件使用with標籤,可以讓資料被快取起來使用。
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 #不要使用這種方式
基於Django自身 資料庫訪問效能優化 集
1.使用標準的資料庫優化技術 在進行django資料庫訪問效能優化之前,首先應該使用標準的資料庫技術對其進行優化,比如給字段加索引,通過使用 django.db.models.field.db index 來給乙個django模型類的字段加索引,設定這個屬性欄位的field.db index tru...
資料庫(五)資料庫訪問效能優化
乙個優良的系統,效能問題是我們必須考慮的問題,而資料庫的效能瓶頸也是我們不得不面對的問題,本章我們將 一下關於資料庫訪問效能優化方面的問題。1 資料庫訪問涉及到的層面 cpu及記憶體 快取資料訪問 比較 排序 事務檢測 sql解析 函式或邏輯運算。網 絡 結果資料傳輸 sql請求 遠端資料庫訪問 d...
Mysql資料庫訪問效能優化
如何在mysql中分配innodb buffer pool size 節選部分 緩衝池大小必須始終等於或者是innodb buffer pool chunk size innodb buffer pool instances的倍數。如果將緩衝池大小更改為不等於或等於innodb buffer poo...