我正在使用一个将失败的MySQL语句与其他错误一起放入日志文件的系统。 修改:由于连接丢失,语句失败。我写了一个简单的python脚本,它扫描日志文件,查找INSERT语句,格式化它们,并创建一个字符串列表
任何字符串都不可能是无效的MySQL语句,但它们也没有共同的结构(它们插入不同的表,不同的列等)。假设它们都是有效的MySQL语句,有没有比这更好的方法来执行它们?
count = 0
for i, statement in enumerate(insertStatements):
if i%10000 == 0:
print "Completed " + str(i) + " of " + str(num) + ", " + str(float(i)/num*100.0) + "%"
# An earlier step split by "INSERT INTO"
# The MySQL statement is terminated by a '"'
insertStatements[i] = "INSERT INTO" + statement.split('"')[0]
try:
cursor.execute(insertStatements[i])
count += 1
except mysql.connector.Error as e:
print e
print insertStatements[i] + '\n'
cnx.commit()
任何给定的日志都可能产生许多MySQL语句,我测试的那个语句有4,794,454个INSERT语句
答案 0 :(得分:1)
我提出问题的意思是,"是否有更有效的方法来缩小我的数百万INSERT查询中的哪一个会失败而不是单独测试每一个?"我可以想到几种方法。一种方法是打开与db的多个连接并并行运行它们。第二个(如果实际失败的查询数量相当小)将批处理它们并缩小不合适的范围。
Batch inserting rows can be orders of magnitude faster比通过网络单独发送每个,因为您节省了网络往返,可能的I / O往返和查询计划的开销。 (Keep in mind you might have to increase the max packet size)但是,如果你的天真错误检查,这将无法确定哪个查询失败,这就是你想要的。但是,你可以实现一种二进制搜索试验和错误算法,可以缩小罪魁祸首:
这个想法是,如果第二步可能成功,你就节省了很多时间。您应该将批次#调整为经验上可能成功的n。