0

Webアプリケーションを作成しようとしています。主な目的は、リクエストデータをデータベースに挿入することです。

これが私の問題です。1つのリクエスト自体に10,000〜1,00,000の情報のデータセットが含まれています(各データセットはデータベースの行として個別に挿入する必要があります)

このアプリケーションで同時に複数のリクエストを受け取る可能性があるため、挿入を高速化する必要があります。

MySQLデータベースを使用していますが、どちらのアプローチが私に適していますか、LOAD DATAまたはBATCH INSERTこれら2つよりも優れた方法がありますか?

アプリケーションはこの情報をどのように取得しますか?-このテーブルからレコードを選択して1つずつ処理し、削除する別のバックグラウンドスレッドベースのJavaアプリケーションがあります。

システムが一度に1つのバッチを処理するように、リクエスト(バッチ)をキューに入れることができますか?-今のところ、データベースにすぐに挿入することを考えていますが、このアプローチが十分に実行可能でない場合は、データをキューに入れることを考えるかもしれません。

情報の取得は、新しいデータの挿入と同時に行う必要がありますか?-はい、私たちはそれを並行して維持しています。

ここにあなたの質問に対する特定の答えがあります、Ollie Jones

ありがとうございました!

4

1 に答える 1

1

Ken White のコメントでは、一括挿入を処理するための有用な SO の質問と回答がいくつか言及されています。LOAD DATA INFILE処理しているレコード ボリュームについては、MyISAM テーブルを使用し、MySQL サーバーで使用されているのと同じファイル システム内のソース ファイルからデータをロードすることで、最高の成功を収めることができます。

ここで行っているのは、一種のキュー操作です。これらのバッチ (「リクエスト」と呼びます) のレコード (「データ セット」と呼びます) を受け取ります。それらを大きなバケット (MySQL テーブル) に入れます。次に、一度に 1 つずつバケットから取り出します。

問題を完全に説明していないため、私のアドバイスが間違っている可能性があります。

各レコード (「データ セット」) は他のすべてのレコードから独立していますか?

レコードが処理される順序は重要ですか? それとも、ランダムな順序で処理した場合に同じ結果が得られますか? つまり、個々の記録の順序を維持する必要がありますか?

ほぼ同時に 200 万行のバッチ (「リクエスト」) を受け取るとどうなりますか? 1 秒間に 1 万件のレコードをロードできると仮定すると (これは高速です!)、これは、両方のバッチを完全にロードするのに 200 秒かかることを意味します。2 番目のバッチのロードを開始する前に、1 つのバッチを完全にロードしようとしますか?

バッチが完全にロードされる前に、これらのバッチの行の処理と削除を開始しても問題ありませんか?

レコードが処理される前に 200 秒以上システムに留まっていても問題ありませんか? レコードはどのくらいの期間保存できますか? (これを「レイテンシー」と呼びます)。

ここで言及しているデータの量を考えると、生きたデータで本番環境に移行する場合は、DBMS ではなく ActiveMQ のようなキューイング システムの使用を検討することをお勧めします。

マルチスレッド Java アプリを構築してレコードのバッチをロードし、それらを RAM の Queue オブジェクト (ConcurrentLinkedQueueインスタンスが適している場合があります) に格納し、1 つずつ処理することも理にかなっています。このアプローチにより、MySQL テーブルをキューとして使用する場合よりも、システムのパフォーマンスをより詳細に制御できます。

于 2013-01-20T17:33:44.613 に答える