一:Django的QuerySets對象是有緩存的藐窄,一旦取出來实愚,它就會在內(nèi)存中存儲一段時間欢揖,盡量重用它。
user = UserProfile.objects.get(id=1)
user.phone #第一次取出來使用,是要對數(shù)據(jù)庫進行訪問
user.username #第二次再用虎眨,就是緩存中的實體了,不需要再訪問數(shù)據(jù)庫
注意如果使用all函數(shù),則每一次都會請求訪問數(shù)據(jù)庫
二:能去redis等等緩存中獲取到數(shù)據(jù)就可以別連接到數(shù)據(jù)庫去處理結(jié)果
三:使用QuerySets的迭代器功能沥割,先緩存起來耗啦,避免占用太多內(nèi)存
四:避免all,使用filter過濾篩選數(shù)據(jù)
五:單一動作需要多次連接數(shù)據(jù)庫時,最好一次性取出所有需要的數(shù)據(jù)机杜,減少連接數(shù)據(jù)庫次數(shù)帜讲。
六:Django中的查詢是惰性的。這意味著在你真正需要獲取數(shù)據(jù)之前它不會訪問數(shù)據(jù)庫椒拗。同時似将,它只獲取你指定的數(shù)據(jù),如果需要其他附加數(shù)據(jù)蚀苛,則要另外發(fā)出請求在验。為了提取所有需要的數(shù)據(jù),可以在查詢集上使用select_related()堵未。
七:默認(rèn)情況下腋舌,Django會從數(shù)據(jù)庫中提取所有字段。defer()和only()這兩個查詢方法來改進渗蟹。第一個用于指定哪些字段不要加載块饺,第二個用于指定只加載哪些字段。
八:如果像我一樣采取的是Django-rest框架雌芽,那么我們可以自定義序列化層刨沦,這幾乎可以縮短一半的時間
九:第三方擴展應(yīng)用可能會花費時間,我們可以更新三方應(yīng)用膘怕,或者自己造輪子來減少response時間
十:應(yīng)用層設(shè)置緩存想诅,數(shù)據(jù)庫用redis作為數(shù)據(jù)庫緩存的中間件
十一:在部署環(huán)境下,加載模版使用緩存岛心,設(shè)置數(shù)據(jù)庫持久化連接