Django 資料庫訪問效能優化

2021-07-20 15:03:49 字數 1863 閱讀 3657

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...