検索

ホームページ  >  に質問  >  本文

最良の方法: Java 8 を使用して MySQL 内の数百万のレコードを取得、暗号化、更新する

<p>MySQL データベースから約 1,000 万件のレコードを読み取り、これらのレコードを暗号化し、暗号化された値を更新してフィールドに戻すという要件があります。 この要件を最も効率的な方法で達成する方法。 </p>

したがって、このオプションは除外されます。 </p> <p><strong>2</strong>: Java の Executor 関数は、バッチ挿入を実装するために当社のアプリケーションの 1 つで以前に使用されていました。ただし、レコード数は 50,000 を超えません。私たちにも同様のアプローチが求められています。したがって、Spring Batch の使用は除外されます。 </p> <p>Java 8/MySQL データベースで考慮すべき機能を探しています。 </p> <p>Java 8: マルチスレッドには Executor、非同期処理には CompletableFuture、ストリーミングには使用します。 </p> <p>MySQL: インデックスを作成します...</p>

P粉211600174P粉211600174459日前627

全員に返信(1)返信します

  • P粉903052556

    P粉9030525562023-08-27 22:48:34

    • 1,000 万行のデータに対する操作には時間がかかり、タイムアウトが発生する可能性があります。
    • MySQL に保存する場合は、VARBINARY または BLOB のみを使用できます。
    • 宣言されたデータ型がソース データより少なくともわずかに大きいことを確認してください。 (SELECT MAX(LENGTH(col)) FROM tbl) で最大長を指定できます。
    • 新しいテーブルを作成し、データをコピーするときに、そのデータを新しいテーブルの他の列に変換することを検討してください。それからテストしてください。
    • 可能であれば、PRIMARY KEY を使用して「最後に中断した場所」を追跡し、反復ごとに 1000 行のデータを処理することを検討してください。 (OFFSET は使用しないでください)。チャンクの詳細: http://mysql.rjweb.org/doc.php/deletebig#deleting_in_chunks
    • はい、何らかの一括挿入を使用してください。ただし、バッチの合計サイズは約 1MB に制限してください。 (16MBは渡すのが難しい)。これにより、データ サイズが上記の 1K を下回る可能性があります。
    • テーブル全体の操作に必要な時間は、一度に 1K 行を処理する 1 回限りの操作と比べて大きな違いはありません。
    • データを暗号化するときは、圧縮してみるのもよいでしょう。これにより、ディスクの占有面積が 3 分の 1 に小さくなる可能性があります。

    返事
    0
  • キャンセル返事