基於Django自身 資料庫訪問效能優化 集

2021-08-24 20:21:43 字數 2134 閱讀 1115

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

訪問資料庫 訪問資料庫

程式執行的時候,資料都是在記憶體中的。當程式終止的時候,通常都需要將資料儲存到磁碟上,無論是儲存到本地磁碟,還是通過網路儲存到伺服器上,最終都會將資料寫入磁碟檔案。而如何定義資料的儲存格式就是乙個大問題。如果我們自己來定義儲存格式,比如儲存乙個班級所有學生的成績單 名字成績 michael99 bo...

資料庫的自身關聯

查詢出每個雇員的編號,姓名及其上級領導的編號,姓名 select e.empno eno,e.ename ename,m.empnomno,m.ename mname from emp e,emp m where e.mgr m.empno 查詢出在1981年僱擁的全部雇員的編號,姓名,僱擁日期 按...