使用Python将数百万条记录插入MySQL数据库

时间:2015-06-19 01:55:42

标签: python mysql insert sql-insert large-data

我有一个包含大约1亿条记录(数字)的txt文件。我正在使用Python读取此文件并使用python中的简单插入语句将其插入MySQL数据库。但它花了很长时间,看起来像剧本永远不会完成。实施这一过程的最佳方式是什么?该脚本使用的内存不到1%,占CPU的10%到15%。

任何处理此类大数据并将其有效插入数据库的建议都将不胜感激。

感谢。

3 个答案:

答案 0 :(得分:5)

将行插入表格的最快方法是使用 LOAD DATA INFILE 语句。

参考:https://dev.mysql.com/doc/refman/5.6/en/load-data.html

执行单个INSERT语句一次插入一行,RBAR(通过痛苦行划线)是非常慢的,因为数据库必须经历的所有工作执行语句...解析语法,语义,准备执行计划,获取和释放锁,写入二进制日志,......

如果你必须做INSERT语句,那么你可以使用MySQL多行插入,这会更快。

  INSERT INTO mytable (fee, fi, fo, fum) VALUES 
   (1,2,3,'shoe')
  ,(4,5,6,'sock')
  ,(7,8,9,'boot') 

如果一次插入四行,则需要执行的语句数量减少75%。

答案 1 :(得分:2)

坚持使用python,您可能想尝试从输入中创建一个元组列表,并使用python mysql连接器中的execute many语句。

如果文件太大,您可以使用生成器将其分块为更易消化的内容。

http://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursor-executemany.html

答案 2 :(得分:1)

最近尝试执行此操作,我发现了一种快速方法,但这可能是因为我正在使用AWS Windows服务器运行与数据库具有快速连接的python。但是,不是一个文件中有一百万行,而是多个文件加起来达到一百万行。它比我测试过的其他直接数据库方法都要快。

使用这种方法,我能够顺序读取文件,然后运行MySQL Infile命令。然后,我也在此过程中使用了线程。将这个过程计时需要20秒,以将一百万行导入MySQL。

免责声明:我是Python的新手,所以我试图查看可以将这个过程推进多远,但是这导致我的DEV AWS-RDS DB变得无响应(我必须重新启动它),因此采取了一种方法最好的方法可能不会淹没整个过程!