如何更快地插入记录

How to insert records faster

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

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

// 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);                     
   }
}

以及在数据库中插入记录的方法: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,一旦准备好输出 csv。将数据加载到文件中。

会很快的。

如果您想通过自己的应用程序插入,请像这样创建批查询并执行到 MySQL 服务器。

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

您需要使用:“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

@Khanna111 的回答很好。

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