0

大量のデータを MYSQL データベースにバッチ挿入しようとしていますが、テーブルの列が受信データのサイズに対応するのに十分な大きさでない場合の対処方法についてアドバイスが必要です。

データ セットが非常に大きい (1Gb 以上) ため、入力データのメモリへのストリーミング読み取りを実行しています。特定の時点で、データを「フラッシュ」し、 jdbcTemplate.batchUpdate を使用してテーブルに挿入しようとします。宛先テーブルのすべての列は VARCHAR であり、サイズが 50 であると想定されています。これは、大部分のデータに対して完全に適切です。ただし、サイズ 15 を超えるデータが到着する場合があるため、INSERT は失敗します (列に対してデータが長すぎます)。

この問題に取り組むための最良のアプローチは何ですか? テーブルのすべての列をやみくもに大きくしたくありません。これは、あまりうまくスケールしない戦略のように思えるからです。また、サイズが大きいため、データを事前に解析しないことをお勧めします。失敗を待ってから、適切な「ALTER TABLE」を実行してデータを再送信する必要がありますか? 失敗したアイテムをキャッシュして、必要な列サイズを決定し、失敗したアイテムのみを再送信することは可能ですか?

これを実行する最適な方法についての指針と一般的なアドバイスを探しています。

ありがとう。

4

2 に答える 2

1

最善の策は、データを挿入バッチに入れる前に検証することだと思います。そうすれば、文字列が長すぎるオブジェクトを拒否するか、文字列を必要なサイズに切り詰めることができます。

于 2011-05-26T17:14:04.193 に答える
0

MySQL列とvarchar列を使用していることを示します。現在の列幅が15であるか50であるかはわかりませんが、どちらの場合でも、列定義をvarchar(255)にすることによるパフォーマンスの低下はありません。私はそれが失敗のケースの多くが成功することを可能にするだろうと思います。

すべてのデータを変更せずにデータベースに保存する必要があるかどうか、またはデータを切り捨てたり変更して収まるようにすることができるかどうかを指定しませんでした。データを変更できると仮定して、ここにいくつかの追加の考えがあります。

まだ長すぎるデータを処理するために、バッチに含める前にデータを検証するというOlafの提案が好きです。読み取った各レコードを検証してから、それを挿入バッチに追加するか、失敗として処理するか(ファイルに保存しますか?)を決定します。

また、読み取り後、データベースに挿入する前に、データに対して実行している処理の量を実際に示すわけではありません。何もしていない場合は、MySQLで利用できる一括読み込みツールを調べる必要があります(私はあなたに話すのに十分な知識がありません)。通常、これらのツールはこれらのタイプのケースを処理できます。

于 2011-05-27T16:04:13.547 に答える