使用 Python 将数百万条记录插入 MySQL 数据库
Inserting millions of records into MySQL database using Python
我有一个包含大约 1 亿条记录(数字)的 txt 文件。我正在 Python 中读取此文件,并使用 python 中的简单插入语句将其插入到 MySQL 数据库中。但它花了很长时间,看起来剧本永远不会完成。执行此过程的最佳方式是什么?该脚本使用不到 1% 的内存和 CPU.
的 10% 到 15%
任何处理如此大的数据并将其有效插入数据库的建议,将不胜感激。
谢谢。
将行插入 table 的最快方法是使用 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%。
坚持使用 python,您可能想尝试从您的输入创建一个元组列表,并使用 python mysql 连接器中的 execute many 语句。
如果文件太大,您可以使用生成器将其分块成更易消化的内容。
http://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursor-executemany.html
最近尝试这样做,我发现了一个快速的方法,但这可能是因为我正在使用 AWS Windows 服务器到 运行 python 从那里有一个快速连接到数据库。但是,不是一个文件中有 100 万行,而是多个文件加起来达到 100 万行。它比我测试过的其他直接数据库方法要快。
通过这种方法,我能够按顺序读取文件,然后 运行 MySQL Infile 命令。然后我也在这个过程中使用了线程。对将 100 万行导入 MySQL.
花费 20 秒的过程进行计时
免责声明:我是 Python 的新手,所以我想看看我能把这个过程推进到什么程度,但它导致我的 DEV AWS-RDS 数据库变得没有响应(我不得不重新启动它),因此最好采用不会淹没流程的方法!
我有一个包含大约 1 亿条记录(数字)的 txt 文件。我正在 Python 中读取此文件,并使用 python 中的简单插入语句将其插入到 MySQL 数据库中。但它花了很长时间,看起来剧本永远不会完成。执行此过程的最佳方式是什么?该脚本使用不到 1% 的内存和 CPU.
的 10% 到 15%任何处理如此大的数据并将其有效插入数据库的建议,将不胜感激。
谢谢。
将行插入 table 的最快方法是使用 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%。
坚持使用 python,您可能想尝试从您的输入创建一个元组列表,并使用 python mysql 连接器中的 execute many 语句。
如果文件太大,您可以使用生成器将其分块成更易消化的内容。
http://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursor-executemany.html
最近尝试这样做,我发现了一个快速的方法,但这可能是因为我正在使用 AWS Windows 服务器到 运行 python 从那里有一个快速连接到数据库。但是,不是一个文件中有 100 万行,而是多个文件加起来达到 100 万行。它比我测试过的其他直接数据库方法要快。
通过这种方法,我能够按顺序读取文件,然后 运行 MySQL Infile 命令。然后我也在这个过程中使用了线程。对将 100 万行导入 MySQL.
花费 20 秒的过程进行计时免责声明:我是 Python 的新手,所以我想看看我能把这个过程推进到什么程度,但它导致我的 DEV AWS-RDS 数据库变得没有响应(我不得不重新启动它),因此最好采用不会淹没流程的方法!