我正在使用Python中的MySQLdb模块与数据库进行交互。我遇到的情况是有一个非常大的列表(成千上万个元素),需要将它们作为行插入表中。
我现在的解决方案是生成一个大的INSERT语句作为字符串并执行它。
INSERT
有没有更聪明的方法?
有一种更聪明的方法。
批量插入的问题在于,默认情况下启用了自动提交功能,从而导致每个insert语句在下一次插入可以启动之前被保存到稳定存储中。
insert
如手册页所述:
默认情况下,MySQL在启用自动提交模式的情况下运行。这意味着,一旦执行更新(修改)表的语句,MySQL就会将更新存储在磁盘上以使其永久保存。要禁用自动提交模式,请使用以下语句:
SET autocommit=0;
通过将autocommit变量设置为0来禁用自动提交模式后,对事务安全表(例如InnoDB,BDB或NDBCLUSTER的表)的更改不会立即变为永久更改。您必须使用COMMIT将更改存储到磁盘,或者使用ROLLBACK忽略更改。
这是RDBMs系统的一个相当普遍的功能,它假定数据库的完整性至关重要。它确实使批量插入的时间约为每个插入1s,而不是1ms。生成超大插入语句的替代方法尝试实现此单次提交,但有可能使SQL解析器过载。