私のアプリケーションでは、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ミリ秒かかります。
何か足りないものはありますか?挿入を速くするにはどうすればよいですか?
コミットをバッチ処理することを検討してください。 1024のバッチサイズが適切な開始サイズです。最適なスループットに達するまでバッチサイズを変更します。
テストしたか、または挿入先の宛先DBテーブルにインデックスを削除し、それらを小さなバッチチャンク(上記のように最適)に挿入して、宛先テーブルのインデックスを再構築することは可能ですか?すべての挿入が完了したら?確認するためにテストするのに十分簡単なものかもしれません。
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
この助けを願っています!