您好,登錄后才能下訂單哦!
一 利用標準數(shù)據(jù)庫優(yōu)化技術
傳統(tǒng)數(shù)據(jù)庫優(yōu)化技術博大精深,不同的數(shù)據(jù)庫有不同的優(yōu)化技巧,但重心還是有規(guī)則的。在這里算是題外話,挑兩點通用的說說:
索引,給關鍵的字段添加索引,性能能更上一層樓,如給表的關聯(lián)字段,搜索頻率高的字段加上索引等。Django建立實體的時候,支持給字段添加索引,具體參考Django.db.models.Field.db_index。按照經(jīng)驗,Django建立實體之前應該早想好表的結構,盡量想到后面的擴展性,避免后面的表的結構變得面目全非。
使用適當字段類型,本來varchar就搞定的字段,就別要text類型,小細節(jié)別不關緊要,后頭數(shù)據(jù)量一上去,愈來愈多的數(shù)據(jù),小字段很可能是大問題。
二 了解Django的QuerySets
了解Django的QuerySets對象,對優(yōu)化簡單程序有至關重要的作用。QuerySets是有緩存的,一旦取出來,它就會在內(nèi)存里呆上一段時間,盡量重用它。
# 了解緩存屬性: >>> entry = Entry.objects.get(id=1) >>> entry.blog # 博客實體第一次取出,是要訪問數(shù)據(jù)庫的 >>> entry.blog # 第二次再用,那它就是緩存里的實體了,不再訪問數(shù)據(jù)庫 >>> entry = Entry.objects.get(id=1) >>> entry.authors.all() # 第一次all函數(shù)會查詢數(shù)據(jù)庫 >>> entry.authors.all() # 第二次all函數(shù)還會查詢數(shù)據(jù)庫
all,count exists是調(diào)用函數(shù)(需要連接數(shù)據(jù)庫處理結果的),注意在模板template里的代碼,模板里不允許括號,但如果使用此類的調(diào)用函數(shù),一樣去連接數(shù)據(jù)庫的,能用緩存的數(shù)據(jù)就別連接到數(shù)據(jù)庫去處理結果。還要注意的是,自定義的實體屬性,如果調(diào)用函數(shù)的,記得自己加上緩存策略。
利用好模板的with標簽:
模板中多次使用的變量,要用with標簽,把它看成變量的緩存行為吧。
使用QuerySets的iterator():
通常QuerySets先調(diào)用iterator再緩存起來,當獲取大量的實體列表而僅使用一次時,緩存行為會耗費寶貴的內(nèi)存,這時iterator()能幫到你,iterator()只調(diào)用iterator而省 去了緩存步驟,顯著減少內(nèi)存占用率,具體參考相關文檔。
三 數(shù)據(jù)庫的工作就交給數(shù)據(jù)庫本身計算,別用Python處理
不要用python語言對以上類型數(shù)據(jù)過濾篩選,同樣的結果,python處理復雜度要高,而且效率不高, 白白浪費內(nèi)存
四 如果需要就一次性取出你所需要的數(shù)據(jù)
單一動作(如:同一個頁面)需要多次連接數(shù)據(jù)庫時,最好一次性取出所有需要的數(shù)據(jù),減少連接數(shù)據(jù)庫次數(shù)。
此類需求推薦使用QuerySet.select_related() (主動連表)和 prefetch_related()(被動連表)
相反,別取出你不需要的東西,模版templates里往往只需要實體的某幾個字段而不是全部,這時QuerySet.values() 和 values_list(),對你有用,它們只取你需要的字段,返回字典dict和列表list類型的東西,在模版里夠用即可,這可減少內(nèi)存損耗,提高性能
同樣QuerySet.defer()和only()對提高性能也有很大的幫助,一個實體里可能有不少的字段,有些字段包含很多元數(shù)據(jù),比如博客的正文,很多字符組成,Django獲取實體時(取出實體過程中會進行一些python類型轉換工作),我們可以延遲大量元數(shù)據(jù)字段的處理,只處理需要的關鍵字段,這時QuerySet.defer()就派上用場了,在函數(shù)里傳入需要延時處理的字段即可;而only()和defer()是相反功能
使用QuerySet.count()代替len(queryset),雖然這兩個處理得出的結果是一樣的,但前者性能優(yōu)秀很多。同理判斷記錄存在時,QuerySet.exists()比if queryset實在強得太多了
五 懂減少數(shù)據(jù)庫的連接數(shù)
使用 QuerySet.update() 和 delete(),這兩個函數(shù)是能批處理多條記錄的,適當使用它們事半功倍;如果可以,別一條條數(shù)據(jù)去update delete處理。
對于一次性取出來的關聯(lián)記錄,獲取外鍵的時候,直接取關聯(lián)表的屬性,而不是取關聯(lián)屬性,如:
entry.blog.id 優(yōu)于 entry.blog__id # 善于使用批量插入記錄,如: Entry.objects.bulk_create([ Entry(headline="Python 3.0 Released"), Entry(headline="Python 3.1 Planned") ]) 優(yōu)于 Entry.objects.create(headline="Python 3.0 Released") Entry.objects.create(headline="Python 3.1 Planned") # 前者只連接一次數(shù)據(jù)庫,而后者連接兩次 # 還有相似的動作需要注意的,如:多對多的關系, my_band.members.add(me, my_friend) 優(yōu)于 my_band.members.add(me) my_band.members.add(my_friend)
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。