現在、私たちはチケット管理システムを持っており、すべての発券システムと同様に、ラウンドロビン方式でケースに代理店を割り当てる必要があります。また、同時に、エージェントは独自のフィルタリングロジックを適用し、キューで作業することができます。MySql Logic Optimization
問題は、チケットと
- テーブルは現在、非常に大規模で、1000万人以上の行にまたがっています。
- 2人の異なるユーザーに1つのチケットを割り当てないでください。
- 上記の問題を解決するには、これは我々が持っている流れで、
- 選択クエリフィルタ条件で焼成し、上記のクエリによって返された行は、その後、IDに基づいて選択し、ためにロックされている0,1
- を制限しています更新。
- 最後に、ユーザーXがそのケースを選択したという更新情報を送信します。
- ステップ3が実行されている間に、他のユーザーが同じケースでロックを取得できないため、次の使用可能なケースを取得するためにクエリが複数回発生する可能性があります。
- 手順4でこの時間が増加するにつれて、ユーザーは増加します。
手順4でクエリで更新を選択してみましたが、クエリ全体が遅くなりました。これは、選択クエリ内に膨大な数の行があるためです。
質問、
- 我々は完全に取る必要がある別のアプローチはありますか?
- ストアドプロシージャで選択と更新を行うと、select for updateを実行してから更新するのと同じ結果が得られますか?
P.S - 私は同じ質問stackexchangeを求めました。
行をロックする必要があります。 SELECTを使用して行を読み込み、古いユーザーを取得し、UPDATEに条件WHERE ... AND user = old_userを追加しました。そうすれば、ある行を更新すれば他のプロセスがこのチケットを取得します –