LOAD DATA INFILEと拡張INSERTにはそれぞれ明確な利点があります。
LOAD DATA INFILEは、次のような機能を実行するために、1回の操作で表データを大量にロードするために設計されています。
- 最初の行をスキップする
- 特定の列をスキップする
- 特定の列の変換
- 特定の列のロード
- 重複キーの問題の処理
解析に必要なオーバーヘッドが少ない
一方、1,000,000行ではなく100行のみをインポートする場合は、拡張INSERTが賢明です。
mysqldumpは、INSERTごとに数百または数千の行の挿入を実行する際に、テーブル設計とデータを運ぶために、拡張INSERTを中心に設計されていることに注意してください。LOAD DATA INFILEは、常にスキーマとデータの間に物理的な二分法を作成します。
アプリケーションの観点から見ると、LOAD DATA INFILEは、拡張INSERTよりもスキーマの変更に敏感ではありません。
LOAD DATA INFILEを使用することの良い点、悪い点、onい点を行き来できます。使用する手法に関係なく、常にbulk_insert_buffer_sizeを設定する必要があります。どうして?
bulk_insert_buffer_sizeのMySQLドキュメントによると:
MyISAMは、特別なツリーのようなキャッシュを使用して、空でないデータを追加するときに、INSERT ... SELECT、INSERT ... VALUES(...)、(...)、...、およびLOAD DATA INFILEの一括挿入を高速化しますテーブル。この変数は、スレッドごとのキャッシュツリーのサイズをバイト単位で制限します。0に設定すると、この最適化が無効になります。デフォルト値は8MBです。
何年もの間、私はクライアントがこれを設定せずに8MBのままにしておくのを見てきました。次に、LOAD DATA INFILEを使用するか、mysqldumpsをインポートすることを決定すると、何か間違っていると感じることがあります。通常、これを中程度の256Mに設定することをお勧めします。場合によっては、512M。
十分な大きさのバルクINSERTバッファーを作成したら、どちらの手法を使用してもアカデミックになり、最終的には個人的な選択になります。必要に応じて100行だけを一括挿入するアプリケーションでは、拡張INSERTを使用してください。
公平に言うと、主に構成が考慮されていないため、LOAD DATA INFILEは通常のINSERTステートメントがロードされたステートメントの一種であるよりも高速であると言っています。LOAD DATA INFILEと適切なbulk_insert_buffer_sizeを使用した拡張INSERTの間にベンチマークを設定した場合でも、各行の解析で節約されるナノ秒は、LOAD DATA INFILEを優先して名目上の結果しか得られません。
さあ、これをmy.cnfに追加してください
[mysqld]
bulk_inset_buffer_size=256M
拡張INSERTを起動する前に、セッションのみに設定することもできます
SET bulk_insert_buffer_size= 1024 * 1024 * 256;
更新2012-07-19 14:58 EDT
物事を把握するために、バルク挿入バッファーは、InnoDBではなくMyISAMテーブルのロードにのみ役立ちます。私はInnoDBのバルクロードに関する最新の投稿を書きました:infileからのMysqlのロードがハードドライブで待機しています
LOAD DATA INFILE
:MySQLでの高速挿入。結論:LOAD DATA INFILE
拡張挿入を使用した場合のパフォーマンスの65%を達成できます 。最新のハードウェアでは、毎秒240,000の挿入を受け取りました。