【问题标题】:Inserting millions of records into MySQL database using Python使用 Python 将数百万条记录插入 MySQL 数据库
【发布时间】:2015-09-04 21:07:24
【问题描述】:

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

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

谢谢。

【问题讨论】:

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


【解决方案1】:

最近尝试这样做,我找到了一个快速的方法,但这可能是因为我使用 AWS Windows 服务器运行 python,它与数据库有快速连接。但是,不是一个文件中有 100 万行,而是多个文件加起来达到 100 万行。无论如何,它比我测试过的其他直接数据库方法要快。

通过这种方法,我能够按顺序读取文件,然后运行 ​​MySQL Infile 命令。然后我也在这个过程中使用了线程。将 100 万行导入 MySQL 需要 20 秒的时间。

免责声明:我是 Python 新手,所以我想看看我能把这个过程推进多远,但它导致我的 DEV AWS-RDS DB 变得无响应(我不得不重新启动它),所以采取了一种方法这可能是最好的!

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 带有INSERT 语句的executemany 调用多行语法...插入多行的单个插入语句。这将比为每一行执行单独的插入语句更快。由于 SQL 语句的大小是有限制的……要插入 1 亿行,如果每次插入 100 行,那仍然是 100 万条语句执行。
    【解决方案3】:

    向表中插入行的最快方法是使用 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%。

    【讨论】:

    • 感谢大家的建议。 LOAD DATA INFILE 为我工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-31
    • 1970-01-01
    • 2012-05-16
    • 1970-01-01
    • 2020-10-31
    • 2012-02-21
    • 2012-05-30
    相关资源
    最近更新 更多