0

多くの挿入を行いたいのですが、しばらくしてから mysql を更新することは可能でしょうか?

たとえば、次のようなクエリがある場合

Update views_table SET views = views + 1 WHERE id = 12;

ビューが 100 に達するまでこのクエリを保存してから、100 回を超えてクエリを実行する代わりに、次のクエリを実行することはできないでしょうか。

Update views_table SET views = views + 100 WHERE id = 12;

さて、それが完了したとしましょう。次に、データの整合性の問題が発生します。たとえば、同じクエリを実行しようとしている 100 個の php ファイルが開いているとします。キャッシュされたビューをインクリメントするロックメカニズムがない限り、複数のファイルがキャッシュされたビューの同じ値を持つ可能性があるため、プロセス 1 に 25 のキャッシュされたビューがあり、php プロセス 2 に 25 のビューとプロセスがあるとします。 3 には、ファイルから 27 のビューが含まれる場合があります。ここで、プロセス 3 が終了し、カウンターが 28 にインクリメントされたとします。次に、php プロセスがほぼ終了し、プロセス 3 の直後に終了したとします。これは、カウンターが 26 に戻ることを意味します。

では、高速でありながらデータの安全性も確保されたソリューションはありますか。

ありがとう

4

2 に答える 2

2

クエリが相対値を使用している限り、問題はありませviews=views+5ん。

値をスクリプトのどこかに保存してから、新しい値を自分で計算する場合にのみ、問題が発生する可能性があります。しかし、なぜこれをしたいのですか?そもそも、なぜこれらすべてを実行したいのでしょうか。:)

データベースに過負荷をかけたくない場合はUPDATE LOW_PRIORITY table set ...LOW_PRIORITYキーワードを使用できます。このキーワードは、更新アクションをキューに入れ、テーブルが読み取りまたは挿入によって使用されなくなるのを待ちます。

于 2011-03-28T21:55:46.493 に答える
0

まず第一に、これらのクエリを使用すると、プロセスがいつ開始されるかに関係なく、UPDATE .. SET col = col + 1これは安全な操作であるため、カウンターが「減少」することはありません。

「ビューが 100 回になるまでこのクエリを保存し、100 回を超えてクエリを実行する代わりに、次のように実行する」に関しては、そうではありません。カウンターをより高速なメモリ (memcached が頭に浮かびます) に格納したり、たまにデータベースに転送するプロセスを使用したり、AFTER UPDATEトリガーを使用して別のテーブルに格納したりできますが、それを行う意味がわかりません。 .

于 2011-03-28T22:00:42.667 に答える