2017-04-27 14 views
0

私はJavaのループを使ってMySQLクエリを実行する速度が不思議で、私が書いたコードでは非常に長い時間がかかりました。私はそれを行うより速い方法があると確信しています。ここには、クエリを実行しているコードがあります。Javaを使用してデータベースに高速に挿入する

PreparedStatement ps=connection.prepareStatement("INSERT INTO books.author VALUES (?,?,?)"); 
for (int i=0;i<100000;i++) 
{ 
     ps.setString(1,test[i][0]); 
     ps.setString(2,test[i][1]); 
     ps.setString(3,test[i][2]); 
     ps.addBatch(); 
} 
int []p=ps.executeBatch(); 

ご協力いただければ幸いです。ありがとうございます

+1

**小さなバッチで実行する方が速いでしょう。 –

+0

[この質問](http://stackoverflow.com/questions/3784197/efficient-way-to-do-batch-inserts-with-jdbc)に到達したという結論は、あなたがそれをやっているやり方がステートメントは一度だけ解析する必要があるため、最も高速です。それはMySqlの代わりにOracleのためのものですが、私は同じ考慮がここに当てはまると思います。 –

+0

OK、私は小さなバッチを作成して実行し、実行に時間がかかっていないかどうかを確認します。ありがとうございました –

答えて

1

あなたの基本的なアプローチは正しいです。 MySQLを使用しているので、this answerで説明されているように、接続URLにrewriteBatchedStatements=trueを追加することができます。バッチINSERT操作をMySQLデータベースに大幅に高速化することが知られています。

+0

そのオプション、大幅なパフォーマンスの向上。 – Wrench

0

巨大なバッチがあるときには、他にもいくつかのことがあります。 "too"を大きくすると、行/秒が遅くなります。これは、いくつかの設定、特定のテーブルスキーマなどによって異なります。私は、より文明化したバッチの2倍の遅さで実行される大きすぎるバッチを見てきました。

追加の10行を挿入するのと同じものとしてクエリを解析するオーバーヘッドについて考えてみましょう。そのルールのThumbに基づいて、1000行のバッチインサートは理論最大速度の1%以内です。

すべての行を含むファイルを作成するのが速く、LOAD DATAを実行する方が速い。しかし、やはりこれはさまざまな設定などに依存します。