1、插入速度缓慢
批量数据的插入,建议不要一行行插入和提交,最好分批(一万行)提交一次。插入的目标表只有24899条数据。
自动提交
自动提交速度缓慢,一行插入完就提交一次,速度巨慢。
# 部分Python 代码
import time
timeStart= time.time()
for row1 in range(0, len(list)):
if Check(str(list[row1])) != '0': # 检核方法
cursor.execute("INSERT into test_checkresult values('%s','%s','%s','%s','%s','%s')" %
(table, column, str(list[row1]), '1',
Check(str(list[row1])),
datetime.now().strftime("%Y-%m-%d %H:%M")))
else:
num += 1
timeEnd = time.time()
messagebox.showinfo('提示', '报告生成成功!' + str(round(timeEnd - timeStart, 2)) + '秒!')
手动提交
同样的数据量,先把insert语句存入list中,再分批执行提交,速度提升10倍左右(受电脑内存影响)
# 部分Python 代码
# 把插入操作存入一个list批量执行
import time
timeStart= time.time()
CalList = []
for row1 in range(0, len(list)):
if Check(str(list[row1])) != '0': # 检核方法
CalList.append("INSERT into test_checkresult values('%s','%s','%s','%s','%s','%s')" %
(table, column, str(list[row1]), '1',
Check(str(list[row1])),
datetime.now().strftime("%Y-%m-%d %H:%M")))
else:
num += 1
cursorTotal = conn.cursor()
rox1 = 0
for rox in range(0, len(CalList)):
cursorTotal.execute(CalList[rox])
rox1 += 1
if rox1 == 10000: # 10000行自动提交
conn.commit()
rox1 = 0
elif rox == len(CalList)-1: # 剩下最后不到10000万的一次提交
conn.commit()
timeEnd = time.time()
messagebox.showinfo('提示', '报告生成成功!' + str(round(timeEnd - timeStart, 2)) + '秒!')
2、插入系统时间对比
因项目需求需要同时插入系统时间,有两种方法,一种是Mysql自带的sysdate()函数,另一种是python的datetime.now()
同时写入530365条数据,对比两种语法:
Mysql时间
for row5 in range(0, len(tmpData)):
if Check(str(tmpData[row1])) != '0':
CalList.append("INSERT into test_checkresult values('%s','%s','%s','%s','%s',SYSDATE())" %
(table, column, str(tmpData[row1]), '1',
Check(str(tmpData[row1])),
reaList[rCodeList[x4]][row5])))
else:
dataNumRight += 1
Mysql耗时稳定在59秒
Python时间
# 上面代码已经使用了datetime,这里就不再粘贴代码了
from datetime import datetime
print(datetime.now().strftime("%Y-%m-%d %H:%M")) # 系统时间
python耗时60秒以上。
综上所述,还是Mysql的耗时稍微小一点。耗时因电脑cpu而异,仅作参考,不吝赐教。如有建议,欢迎讨论。