私は1つのMySQLインスタンスから多数のレコードをRDS内で2つずつ移動しようとしています。彼らは異なるVPCと異なるAWSアカウントにあるので、私のためにコピーを行うデータパイプラインを作成することはできません。複数の挿入を一括して実行するには、mysql jdbcドライバクラスが認識していますか?
私は、インポート・データベースおよびエクスポート・データベースの両方に接続しない迅速なJavaプログラムを書いた次
- クエリ
SELECT MAX(primary_key) FROM table
- とtable.primary_keyで最高のインポートデータベース
SELECT * FROM table WHERE(primary_key > max_from_import) LIMIT 1000000
- でエクスポートテーブルからの結果セットは、インポート接続からPreparedStatementオブジェクトを作成し、結果セットとs上
INSERT INTO table (col1....coln) VALUES (?....n?)
- 反復するためのqueryStringを設定しますPreparedStatementオブジェクトを実行し、そのパラメータをクリアしてから次の結果に移動します。私は時間をインポートされて周り100000レコードを表示することができるよ、私はthis questionからの挿入を最適化する方法は、新しいクエリを毎回作成するために、より多くのデータを追加しないことをことを知っているこの方法で
それぞれのインサートで。すなわち
INSERT INTO table (col1...coln) VALUES (val1...valn), (val1...valn)....(val1...valn);
JDBCドライバは、これを行うには知っている、または私は、インサートの実行時間を改善するために、私の終わりに作ることができ、最適化のいくつかの並べ替えがありますか?
更新: 追加と実行のバッチを使用して自動コミットを削除することをお勧めします。オートコミットを削除するとわずかな改善(10%)が見られ、バッチを実行すると個々のインサートの実行時間が50%未満になりました。
MyISAMテーブルを使用していない限り、トランザクション内に挿入ステートメントをラップし、オートコミットをオフにしたり、 100または1000の挿入ごとにコミットを発行します。正確な詳細は私には分かりますが、質問には 'rewriteBatchedStatements'接続オプションがあります。ここにはhttps://dev.mysql.com/doc/connector-j/5.1/en/connector-j-reference-configuration- properties.html – nos
おそらく 'Statement#executeBatch()'が役に立ちます。 –
@CBredlow - あなたは自分の方法で挿入をスピードアップできますか? –