【问题标题】:How to insert records faster如何更快地插入记录
【发布时间】:2015-02-25 06:44:14
【问题描述】:

我必须从 CSV 文件中读取记录并将它们存储在 Mysql 数据库中。

我知道“LOAD DATA INFILE”,但在我的情况下,我必须从文件中获取单个记录,检查它是否具有有效的格式/长度等,然后将其存储在数据库中。

// list to store records from CSV file
ArrayList<String> list = new ArrayList<String>();

//Read one line at a time
while ((nextLine = reader.readNext()) != null) 
{
   for (String number : nextLine) 
   {
      if (number.length() > 12 && number.startsWith("88"))
      {        
         list.add(number);
      } else if (number.length() > 9 && number.startsWith("54")) 
      {
         list.add(number);
      }
      else if (number.length() > 8 && number.startsWith("99"))
      {
         list.add(number);
      }
      else
      {
        // ....
      }

      // method to insert data in database
      insertInToDatabase(list);                     
   }
}

在db中插入记录的方法:taken from here

private void insertInToDatabase(ArrayList<String> list) 
{
   try
   {
      String query = "INSERT INTO mytable(numbers) VALUES(?)";

        prepStm = conn.prepareStatement(query);

        for (String test : list) 
        {
            prepStm.setString(1, test);

            prepStm.addBatch();// add to batch
            prepStm.clearParameters();
        }

        prepStm.executeBatch();
    }
}

这是可行的,但插入记录的速度非常慢。 有什么方法可以让我更快地插入记录。

【问题讨论】:

  • 你能提供更多细节吗? CSV 大约有多少行。包含?您是否检查过读取文件/写入数据库需要多长时间?
  • 现在,用于测试 CSV 文件包含 90k 条记录,插入所有记录大约需要 45 分钟。
  • 我的意思是你测试了读取和插入需要多长时间?您可以只插入三个 System.out.println(System.currentTimeMillis())。一个在读取开始之前,一个在读取完成之后,一个在插入到数据库之后完成通过这种方式,您可以确定是否真的是插入数据库(或解析本身)如此缓慢

标签: java mysql prepared-statement sql-insert


【解决方案1】:

您需要使用:“rewriteBatchedStatement”,因为这是一个 MYSQL 优化,它试图通过将插入或更新合并到尽可能少的数据包中来减少到服务器的往返行程。

请参考: https://anonymousbi.wordpress.com/2014/02/11/increase-mysql-output-to-80k-rowssecond-in-pentaho-data-integration/

此外,该文章中还有其他优化。希望这能加快批处理速度。

编辑 1: 本站对这个参数也有清晰的解释:参考:MySQL and JDBC with rewriteBatchedStatements=true

【讨论】:

  • 我尝试添加rewriteBatchedStatements=true,它使插入非常快,在几秒钟内插入所有记录。但是我在该字段上有一个唯一索引,所以这给了我一个例外。 [bugs.mysql.com/bug.php?id=6822]。有什么办法吗?
  • 那将是另一个问题,一旦您提出问题,人们将能够回答。这就是网站的运作方式。你可以解决这个问题并问另一个。
【解决方案2】:

@Khanna111 的回答很好。

我不知道它是否有帮助,但请尝试检查表引擎类型。我曾经遇到过记录插入速度很慢的问题。我将引擎从 InnoDB 更改为 MyISAM,插入变得非常快。

【讨论】:

    【解决方案3】:

    我认为更好的方法是使用定义的规则处理 csv 文件,然后创建另一个 csv,一旦准备好输出 csv。将数据加载到文件中。

    很快。

    【讨论】:

      【解决方案4】:

      如果你想通过自己的应用程序插入这样的批处理查询并执行到 MySQL 服务器。

      String query = "INSERT INTO mytable(numbers) 
                      VALUES (0),
                             (1),
                             (2),
                             (3)";
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-01-29
        • 2013-11-10
        • 2011-02-22
        • 2021-10-15
        • 1970-01-01
        • 1970-01-01
        • 2015-12-04
        • 2015-08-14
        相关资源
        最近更新 更多