8

大きな XML ファイルを解析し、insert ステートメントを含むファイルを作成するプログラムを C で作成しました。他のプロセスがファイルを MySQL データベースに取り込みます。このデータはインデックス サービスとして機能するため、ユーザーはドキュメントを簡単に見つけることができます。

行レベルのロック機能のために InnoDB を選択しました。C プログラムは、特定の呼び出しで 500 から 500 万の挿入ステートメントを生成します。

このすべてのデータをできるだけ早くデータベースに入れる最善の方法は何ですか? もう 1 つの注意点は、DB が別のサーバー上にあることです。挿入を高速化するためにファイルをそのサーバーに移動する価値はありますか?

編集: このテーブルは実際には更新されませんが、行は削除されます。

4

6 に答える 6

15
  • mysqlimport ツールまたは LOAD DATA INFILE コマンドを使用します。
  • データの整合性に不要なインデックスを一時的に無効にする
于 2008-11-24T16:13:33.410 に答える
2

このリンクに従って、少なくともこれらのことを行います。

  1. そこにファイルを移動し、UNIX ソケット経由で接続します
  2. INSERTS の代わりにLOAD DATA INFILEファイルを生成する
  3. ロード中のインデックスの無効化
于 2008-11-24T16:13:28.013 に答える
1

標準テーブル形式の MySQL は、書き込み専用テーブルである限り、驚くほど高速です。最初の質問は、更新するか削除するかです。そうでない場合は、innosys を使用しないでください。単に追加するだけであれば、ロックする必要はありません。テーブルのサイズに対処するために、出力ファイルを定期的に切り捨てるか、名前を変更することができます。

于 2008-11-24T16:13:47.483 に答える
1

1. 必ずトランザクションを使用してください。

トランザクションは

挿入、ディスクに同期

繰り返しフェーズではなく、トランザクションを COMMIT するときにすべてのディスク IO が実行されます。

2.接続圧縮を利用するようにしてください

生のテキスト + GZip 圧縮ストリーム ~= 場合によっては 90% もの帯域幅を節約できます。

3. 可能な場合は並列挿入記法を利用する

INSERT INTO TableName(Col1,Col2) VALUES (1,1),(1,2),(1,3) 

(送信するテキストが少なく、アクションが短い)

于 2008-11-24T16:15:42.143 に答える
1

他の人が提案したように LOAD DATA INFILE を使用できない場合は、挿入に準備されたクエリを使用してください。

于 2008-11-24T16:29:26.937 に答える
1

本当にエンジン次第です。InnoDB を使用している場合は、トランザクションを使用してください (それらを避けることはできませんが、自動コミットを使用する場合は、各バッチが暗黙的に独自の txn に含まれます)。ただし、トランザクションが大きすぎたり小さすぎたりしないようにしてください。

MyISAM を使用している場合、トランザクションは無意味です。インデックスを無効にして有効にすることで挿入速度を向上させることができますが、それは空のテーブルでのみ有効です。

空のテーブルから開始する場合は、通常、それが最適です。

いずれにせよ、LOAD DATA が勝者です。

于 2008-11-24T16:51:22.727 に答える