2011-08-16 20 views
4

SQLテーブルに一度にさらに多くの行を挿入したいと思います。私はそれを行う最良の方法が何であるかを知りたいと思います。バッチSQLはMySQLの最適化に適していますか?

1)は、データ

INSERT INTO message (email, txt) VALUES ('[email protected]', 'txt1'); 
INSERT INTO message (email, txt) VALUES ('[email protected]', 'txt2'); 
INSERT INTO message (email, txt) VALUES ('[email protected]', 'txt3'); 

2)、または代わりにバルクインサートを使用し、各部分のためのINSERTステートメントを使用するのか?

INSERT INTO message (email, txt) VALUES ('[email protected]', 'txt1'),('[email protected]', 'txt2'),('[email protected]', 'txt3'); 

INSERTごとに数十個のデータがあります。最適化の観点からどれが良いですか?ところで

:TXTは、テキスト型の列

は、事前にあなたのアドバイスをありがとうです!

Jakub

答えて

3

これは、トランザクションの動作、およびmysqlサーバの待ち時間によって異なります。

しかし、一般的には、複数行の挿入が有効です。しかし、最大パケットサイズ(select @@max_allowed_packet)に遭遇しないように注意してください。

自動コミットがオンの場合でも、複数行の挿入が単一のトランザクションで実行されます。これにより、トランザクションログへの同期の数が減少し、挿入パフォーマンスが向上する可能性があります。これはinnodb_flush_log_at_trx_commit = 1と仮定しています。データを気にする必要があります。

5

小規模なデータセットの場合、実際には問題ありません。しかし、一般にバルクインサートはより速くなる。

+0

OPによると、あなたのリンクはOracle向けです。それらに意味をなさないかもしれません。 – MarkR

+0

@ markr right、リンクを削除しました... mysqlのベンチマークを探しています... – hvgotcodes

0

私はSQLの一括挿入を見てくださいと思います。 http://msdn.microsoft.com/en-us/library/ms188365.aspx

トリガーには注意してください。 バルク操作を処理するためにそれらを記述する必要があります。

推奨バッチサイズは、バッチあたり750,000行です。あなたはバルクを使用するときに:インデックスを有効にして、テーブルをリリース:

  • はインデックス
  • を実行し、一時的に終わりにバッチ
  • で一括挿入をテーブル
  • 無効化をロックします。