我有一个包含大约1亿条记录(数字)的txt文件。我正在使用Python读取此文件并使用python中的简单插入语句将其插入MySQL数据库。但它花了很长时间,看起来像剧本永远不会完成。实施这一过程的最佳方式是什么?该脚本使用的内存不到1%,占CPU的10%到15%。
任何处理此类大数据并将其有效插入数据库的建议都将不胜感激。
感谢。
答案 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变得无响应(我必须重新启动它),因此采取了一种方法最好的方法可能不会淹没整个过程!