私のアプリケーションでは、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ミリ秒かかります。
何か足りないものはありますか?挿入を速くするにはどうすればよいですか?