【问题标题】:How to import huge data from tsv to MySQL using jdbc faster?如何使用 jdbc 更快地将大量数据从 tsv 导入 MySQL?
【发布时间】:2021-01-29 08:12:00
【问题描述】:

我有两个巨大的 tsv 文件(1000 万条记录),其中一个 tsv 文件具有属性 id、name、age 和其他属性 id、email 和 phno。 我尝试读取第一个文件并将记录插入到 Person 表中,然后读取第二个文件并更新 Person 表。这种方法需要时间,因为首先在表中插入 1000 万条记录,然后对其进行更新。有没有其他方法可以加快这个过程? PS第二个tsv文件中没有一些ID,所以我无法合并它们。

【问题讨论】:

  • 欢迎来到 SO。我认为最终插入大量数据需要时间。您可能希望将负载分布在连接到数据库的多个客户端上。但是我怀疑您需要查看您的 JDBC 驱动程序以及可以在那里配置的内容。可能有帮助的一件事是使用原始 JDBC 而不是 JPA/Hibernate,因为您希望只使用插入。最后,与其猜测瓶颈在哪里运行分析器,您可能会惊讶于在哪里可以获得性能提升。
  • 一个答案详细介绍了使用 LOAD DATA 来加载第一个大文件。请进一步解释第二个文件。它是关于同一个文件吗?你真的是在“更新”还是“替换”? “更新”的标准是什么?关键是可能 SQL 会比 JDBC 快得多。

标签: java mysql jdbc


【解决方案1】:

为什么不试试 LOAD DATA INFILE,它是一个高度优化的、MySQL 特定的语句,它直接将数据从 CSV / TSV 文件。

有两种方法可以使用 LOAD DATA INFILE。您可以将数据文件复制到服务器的数据目录(通常为 /var/lib/mysql-files/)并运行:

LOAD DATA INFILE '/path/to/products.csv' INTO TABLE products;

或者也可以在客户端存储数据文件,使用LOCAL关键字:

LOAD DATA INFILE '/path/to/products.csv' INTO TABLE products;

High-speed inserts with MySQL

您还应该检查MySql Documentation - LOAD DATA Statement 你可以使用这样的语句:

LOAD DATA INFILE 'data.txt' 
  INTO TABLE tbl_name
  FIELDS TERMINATED BY ',' ENCLOSED BY '"'
  LINES TERMINATED BY '\r\n'
  IGNORE 1 LINES;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-22
    • 1970-01-01
    • 2012-07-27
    • 2021-10-15
    • 2013-10-15
    • 1970-01-01
    • 2015-12-17
    • 2013-07-21
    相关资源
    最近更新 更多