1

2 億 3700 万行の MySQL テーブルがあります。これらの行をすべて処理し、新しい値で更新したいと考えています。

私は連続した ID を持っているので、多くのselectステートメントを使用できます。

where id = '1'
where id = '2'

これは、1,000,000 レコードの MYSQL テーブルを順次実行しますか? で説明されている方法です。.

しかし、フルセットをメモリにロードする必要なく、大きなファイルを順番に読み取るために使用されるカーソルのようなものを使用するより高速な方法があるかどうかを知りたいです。select私の見方では、カーソルは、数百万のステートメントを実行してデータを扱いやすいチャンクに戻すよりもはるかに高速です。

4

1 に答える 1

7

理想的には、DBMS に作業を任せることができます。アプリケーションにデータを返さずに、データベース内でのみ実行されるように SQL ステートメントを作成します。他のすべてを別にすると、これにより、クライアントへの 2 億 3,700 万のメッセージとサーバーへの 2 億 3,700 万のメッセージのオーバーヘッドが節約されます。

これが実現可能かどうかは、更新の性質によって異なります。

  • DBMS は、新しい値がどうあるべきかを判断できますか?
  • DBMS が新しい値を決定できるように、データベースに必要なデータを取得できますか?
  • 2 億 3,700 万行のすべてが変更されるのか、それともサブセットのみが変更されるのか?
  • サブセットを決定するために DBMS を使用できますか?
  • 値のいずれかがidまったく変更されますか?

値が決して変更されない場合はid、「管理可能」の柔軟な定義のために、データを管理可能なサブセットに分割するように手配できます。

トランザクションの境界を考慮する必要がある場合があります。ログを吹き飛ばすことなく、すべてを単一のトランザクションで実行できますか? 単一のアトミック トランザクションとしてではなくサブセットで操作を行う場合、駆動プロセスが 1 億 9700 万行の処理でクラッシュした場合はどうしますか? それとも、その時点で DBMS がクラッシュしますか? 処理を完了するために操作を再開する場所をどのように知ることができますか?

于 2012-05-28T17:25:22.730 に答える