pymysql中execute和executemany的性能比较,和原生SQL相比如何快多少?测试环境python3mysqlpymysql老规矩,先测试代码:classIN_sql():def__init__(self):print('initializing...')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()defworkOn(self):L=[]withopen("./1W.txt","r",encoding="utf-8")asf:whileTrue:res=f.readline().replace("\r","").replace("\n","")如果不是res:breakL.append(res)#统计插入所需时间start=time.time()sql="insertignoreintoarticle(an)values(%s);"#execute在L中为l执行代码:self.铜.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)1W10W100Wexecute3.12625.139248.022executemany0.10.98110.854综上所述,我们可以看出明显的区别。如果需要批量插入数据库,最好使用executemany方法。这根本不是execute的一个数量级!!!==最近有朋友问,executemany和nativeSQL语句有很多区别吗?==这里我又测试了一下:defworkOn(self):L=[]withopen("./100W.txt","r",encoding="utf-8")asf:whileTrue:res=f.readline().replace("\r","").replace("\n","")ifnotres:breakL.append(res)#统计插入所需时间start=time.time()print("starttime:"+time.strftime("%Y-%m-%d%H:%M:%S",time.localtime(start)))sql="插入文章(an)值"对于l在L:sql+="('%s'),"%lsql=sql.rstrip(',')+';'self.cu.execute(sql)self.connDB.commit()end=time.time()print("结束时间:"+time.strftime("%Y-%m-%d%H:%M:%S",time.localtime(end)))print('总时间(秒):'+str(round(end-start,3)))最终结果:20.176s什么?==为什么执行原生SQL比executemany慢?理论上nativeSQL应该是最快的==通过查询源码,executemany实际上是将各种参数组合成一条SQL语句执行(==insertintoarticle(an)values(),(),(),(),(),()==),优化主要在字符串的拼接上。最后经过测试发现,我自己的代码字符串拼接耗时12s左右,写SQL语句耗时8s左右,executemany字符串拼接只用了2s左右。所以小伙伴们,以后遇到大量数据写入的时候尽量使用executemany方法吧!
