1

テーブル内の列全体(ユーザートークンに使用)をワイプする必要がある状況にあります。つまり、すべてのユーザートークンが同時にリセットされます。これを行うには2つの方法があります。個別のUPDATEクエリを使用して各ユーザーのトークンを個別にリセットします。または、すべての行に影響する1つの大きなクエリを作成します。

1つの大きなクエリの利点は、明らかにはるかに高速になることですが、データベースが大きい場合の大きなUPDATEクエリの影響について心配しています。クエリ中に発生するリクエストは影響を受けますか?

4

2 に答える 2

1

それはそれほど単純ではありません。ダーティ リードを有効にしても、1 つの大きな更新を実行すると、多くの欠点があります。

  • 1 つの列を更新する実行時間の長いトランザクションは、他の挿入、更新、および削除トランザクションを効果的にブロックします。
  • サーバーは、その巨大なトランザクションをロールバックできるように、発生しているすべてのことをログ ファイルに書き込む必要があるため、トランザクションが長時間実行されると、ディスクに膨大な負荷がかかります。
  • トランザクションが失敗した場合、トランザクションを完全に再実行する必要があり、再開できません。

したがって、同時要件が「実行に時間がかかる可能性のある 1 つのバッチで」解釈できる場合は、バッチ処理を選択します。MySql での DELETE のパフォーマンスに関する優れた調査報告がhttp://mysql.rjweb.org/doc.php/deletebigにあり、調査結果のほとんどは UPDATE に適用できると思います。

秘訣は、最適な「バッチサイズ」を見つけることです。

バッチ処理の追加の利点は、このプロセスを障害に対して回復力があり、再起動しやすいものにすることができることです。

于 2012-11-22T04:14:44.720 に答える
1

答えは、確立したトランザクションと分離レベルによって異なります。

分離を設定して、「ダーティ読み取り」、「ファントム読み取り」を許可したり、読み取りと書き込みのシリアル化を強制したりできます。

どのように UPDATE を実行しても、それを 1 つの作業単位にする必要があります。

ネットワーク遅延を最小限に抑え、すべてのユーザー トークンを 1 回のネットワーク ラウンドトリップで更新することをお勧めします。これは、単一のクエリを作成するか、多数のクエリを 1 つのリクエストにバッチ処理することを意味します。

于 2012-11-22T03:22:20.900 に答える