老規矩,先上測試代碼:python
class IN_sql(): def __init__(self): print('初始化中...') self.connDB = pymysql.connect(host=DB_HOST, user=DB_USER, passwd=DB_PASSWD, db=DB_DB, charset='utf8mb4') self.connDB.ping() self.cu=self.connDB.cursor() def workOn(self): L=[] with open("./1W.txt","r",encoding="utf-8")as f: while True: res=f.readline().replace("\r","").replace("\n","") if not res: break L.append(res) #統計插入所需時間 start = time.time() sql = "insert ignore into article(an) values(%s);" #execute 執行代碼 for l in L: self.cu.execute(sql, l) #executemany 執行代碼 #self.cu.executemany(sql, tuple(L)) self.connDB.commit() print('共計用時(秒):' + str(round(time.time() - start, 2))) self.cu.close() self.connDB.close() if __name__ == '__main__': insert=IN_sql() insert.workOn()
方法量級耗時(s) | 1W | 10W | 100W | |
---|---|---|---|---|
execute | 3.126 | 25.139 | 248.022 | |
executemany | 0.1 | 0.981 | 10.854 |
能夠看出明顯的區別,,若是須要批量插入數據庫,仍是用 executemany方法好些,這個和execute 徹底不是一個數量級!!!mysql
==最近有朋友問到,executemany 和原生SQL 語句有好多的區別?==
這裏本人又進行了測試:sql
def workOn(self): L=[] with open("./100W.txt","r",encoding="utf-8")as f: while True: res=f.readline().replace("\r","").replace("\n","") if not res: break L.append(res) #統計插入所需時間 start = time.time() print("start time:" + time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(start))) sql = "insert into article(an) values " for l in L: sql += "('%s'), " % l sql = sql.rstrip(', ') + ';' self.cu.execute(sql) self.connDB.commit() end=time.time() print("end time:"+time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(end))) print('共計用時(秒):' + str(round(end - start, 3)))
最終結果:20.176s數據庫
==爲何執行原生SQL 比executemany 還要慢啊?理論上原生SQL應該是最快的。==數組
經過查詢源碼得知,executemany實際上也是把各個參數組合成一條SQL語句執行(==insert into article(an) values (),(),(),(),(),()==),優化的地方主要是在字符串的拼接上。app
最後通過測試獲得:本人本身的代碼字符串拼接花了12s左右的時間,寫入SQL語句花了8s左右,而executemany 字符串拼接僅花了2s左右。測試
因此,小夥伴們之後遇到大批量數據寫入時儘可能使用executemany 方法吧!優化