web-dev-qa-db-ja.com

大きなバッチの挿入速度

私のアプリケーションでは、INSERTにかなりの時間がかかっているようです。テーブルに挿入したいオブジェクトがメモリ内に多数(約40〜50,000)あります。

サンプルテーブルを見てみましょう

CREATE TABLE bill (
id BIGINT(20) PRIMARY KEY,
amount INT(11) DEFAULT 0,
bill_date DATETIME DEFAULT NOW(),
INDEX (bill_date)
) ENGINE=InnoDB

私のバッチサイズとして3行を取ると、以下は挿入するために考えられるアプローチです

アプローチ1-3つの未加工インサートを作成して起動する

INSERT INTO bill (amount, bill_date) VALUES (10, '2012-01-01 00:00:00');
INSERT INTO bill (amount, bill_date) VALUES (20, '2012-01-02 00:00:00');
INSERT INTO bill (amount, bill_date) VALUES (40, '2013-02-05 00:00:00');

アプローチ2-値を1つのクエリに結合する

INSERT INTO bill (amount, bill_date) VALUES 
(10, '2012-01-01 00:00:00'),
(20, '2012-01-02 00:00:00'),
(40, '2013-02-05 00:00:00');

アプローチ3-このクエリを1回起動して6つのパラメータを渡す

INSERT INTO bill (amount, bill_date) VALUES 
(?, ?), (?, ?), (?, ?);

アプローチ4-この準備されたクエリを3回起動し、2つのパラメータを毎回変更する

INSERT INTO bill (amount, bill_date) VALUES (?, ?);

その他のアプローチは大歓迎です。

私の質問は

テーブルに複数の挿入を行う最も速い方法は何ですか?

私は mysql挿入速度のこのリンクJDBCプログラミングのこのガイド を読みましたが、結論を出すことができません。

私のケース-

現在、私のテーブルには20列程度があり、そのほとんどが数値で、2つのvarchar(60)と1つのテキスト列があります。 Mysqlバージョン5.5。 INNODBで実行され、整数主キーに1つのインデックスがあります。すべてのクエリはトランザクションで実行されます。

Java=からクエリを作成し、Spring JDBCを使用してクエリを実行します。

私は現在アプローチ3に従っています。空のテーブルへの20,000の挿入には約10秒かかります(クエリの構築にかかる時間は含まれません)。

全体像を保つために、テーブルからデータをフェッチするには100〜200ミリ秒かかります。

何か足りないものはありますか?挿入を速くするにはどうすればよいですか?

10
Aditya

コミットをバッチ処理することを検討してください。 1024のバッチサイズが適切な開始サイズです。最適なスループットに達するまでバッチサイズを変更します。

3
Rick Ryker

テストしたか、または挿入先の宛先DBテーブルにインデックスを削除し、それらを小さなバッチチャンク(上記のように最適)に挿入して、宛先テーブルのインデックスを再構築することは可能ですか?すべての挿入が完了したら?確認するためにテストするのに十分簡単なものかもしれません。

1
Pimp Juice IT

Mysqlドキュメントからのデータの一括読み込みに関するヒントが役立つ場合があります。 https://dev.mysql.com/doc/refman/5.6/en/optimizing-innodb-bulk-data-loading.html

いくつかの方法で挿入速度を上げることができます。

- turn off autocommit
- turn off unique check
- turn off foreign check

この助けを願っています!

0
Luke Nguyen