大きなバッチの挿入速度


10

私のアプリケーションでは、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つのrawインサートを作成して起動する

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-6つのパラメーターを渡してこのクエリを1回起動する

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ミリ秒かかります。

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


スタックオーバーフローの関連質問:rewriteBatchedStatements = trueを使用したMySQLおよびJDBC
Gord Thompson

回答:


3

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


1

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


0

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

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


2
制約チェック(一意の外部キーなど)をオフにする場合は、データがそれらを壊さないこと、またはデータベースがその時点以降一貫性のない状態にあることを非常に確認してください。
David Spillett、2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.