性能問題
寫代碼最終要的兩點是什麼?我認爲1是功能的實現問題。2是代碼的運行速度問題也就是代碼的優化問題。
一般來說普通的新增或修改使用Django提供的API最直接的create和update或者加上鎖的select_for_update等
看一下對比代碼如下:
單條插入
for i in range(1000):
Stduent.objects.create(id=xxx,name=xxx)
單條修改
for i in range(1000):
Stduent.objects.update(name=xxx)
這種代碼功能是可以實現但是讓人一看就感覺寫代碼的人像個XX,一點都不會想到代碼的優化,看着還彆扭。像這種一口氣插入很多條的一般使用多條插入的方法。
多條插入
student_list = []
for i in range(1000):
student = Stduent(id=xxx,name=xxx)
student_list.append(student_list)
Stduent.objects.bulk_create(student_list)
多條修改
student_list = []
for i in range(1000):
student = Stduent(name=xxx)
student_list.append(student_list)
Stduent.objects.bulk_update(student_list)
bulk_create和bulk_update方法的參數是一個對象集合。注意是對象集合。裏面存放的都是一個個對象。像上面的代碼,先申請一個集合用來存放對象。在for循環裏使用對象初始化,初始化完存入集合不用對象.save(),當執行完畢之後,最後執行bulk_create或bulk_update一口氣全部新增。這個就和java的在mapper文件中使用foreach一樣。
<foreach collection="ids" item="user_id" open="AND (" close=")" separator="OR">
//代碼塊
</foreach>
這種方式比單條插入的好處在於不用每次添加都訪問數據庫。要知道當需要添加的數據變多後。每條都訪問數據庫這個代價是相當的大。就像爲什麼項目中有的地方要使用緩存一樣。就是爲了減輕數據庫壓力。如果數據庫被壓死。那整個項目就崩了。
還有一點我的理解就是爲了代碼的美觀性和可讀性,在寫代碼的時候儘量能封裝方法就封裝方法。因爲一個函數中一大串代碼看起來真的很費勁。