MySQLに大量のデータを迅速に挿入する最良の方法は何ですか?
-
10-07-2019 - |
質問
大きなXMLファイルを解析し、挿入ステートメントを使用してファイルを作成するプログラムをCで作成しました。他のプロセスがファイルをMySQLデータベースに取り込みます。 このデータは、ユーザーがドキュメントを簡単に見つけられるように、インデックスサービスとして機能します。
行レベルのロック機能のためにInnoDBを選択しました。 Cプログラムは、指定された呼び出しで500〜500万のinsertステートメントを生成します。
すべてのデータをできるだけ早くデータベースに取り込む最良の方法は何ですか?もう1つ注意すべき点は、DBが別のサーバー上にあることです。挿入を高速化するためにファイルをそのサーバーに移動する価値はありますか?
EDIT:このテーブルは実際には更新されませんが、行は削除されます。
解決
- mysqlimportツールまたはLOAD DATA INFILEコマンドを使用します。
- データの整合性に必要のないインデックスを一時的に無効にします
他のヒント
- ファイルをそこに移動し、UNIXソケットを介して接続します
- INSERTの代わりに、 DATA INFILEを生成するファイル
- 読み込み中のインデックスの無効化
標準テーブル形式のMySQLは、書き込み専用のテーブルである限り驚くほど高速です。最初の質問は、更新するか削除するかです。そうでない場合は、innosysを使用しないでください。追加するだけであれば、ロックする必要はありません。テーブルサイズを処理するために、出力ファイルを定期的に切り詰めたり、名前を変更したりできます。
1。必ずトランザクションを使用してください。
トランザクションは排除します
INSERT、SYNC-TO-DISK
反復フェーズ。代わりに、トランザクションをコミットするときにすべてのディスクIOが実行されます。
2。接続圧縮を利用してください
生テキスト+ GZip圧縮ストリーム〜=場合によっては90%もの帯域幅の節約。
3。可能な場合は並列挿入表記を使用します
INSERT INTO TableName(Col1,Col2) VALUES (1,1),(1,2),(1,3)
(送信するテキストが少なく、アクションが短い)
他の人が提案したようにLOAD DATA INFILEを使用できない場合は、挿入のために準備されたクエリを使用します。
本当にエンジンに依存します。 InnoDBを使用している場合は、トランザクションを使用してください(避けることはできません-ただし、オートコミットを使用する場合、各バッチは暗黙的に独自のtxnにあります)が、大きすぎたり小さすぎたりしないようにしてください。
MyISAMを使用している場合、トランザクションは無意味です。インデックスを無効および有効にすることで挿入速度を向上させることができますが、これは空のテーブルでのみ有効です。
空のテーブルから開始する場合は、一般的に最適です。
LOAD DATAはどちらの場合でも勝者です。