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