有效地执行许多不同的INSERT语句

时间:2015-01-21 00:24:35

标签: python mysql

我正在使用一个将失败的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语句

1 个答案:

答案 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)但是,如果你的天真错误检查,这将无法确定哪个查询失败,这就是你想要的。但是,你可以实现一种二进制搜索试验和错误算法,可以缩小罪魁祸首:

  1. 发送100K INSERTS
  2. 如果成功,请发送下一个100K
  3. Else回滚并以第一个50K重复,然后以第二个50K
  4. 重复

    这个想法是,如果第二步可能成功,你就节省了很多时间。您应该将批次#调整为经验上可能成功的n。