0

私は語彙に絶望的であり、私自身の検索はどこにも行かないので、我慢してください。

ここで、ここで希望する方法で更新すると(GROUP_CONCATsもユーザー定義の変数に格納されている場合)、テーブル全体がロックされることを学びました。

これを行うための最良の方法は、デッドロックや競合、またはそれが呼ばれるものの可能性が低いと確信しているため、最も高いPK IDから始めて、降順で行ごとに行うことですUPDATECURSOR(私は語彙が悪かったとあなたに言いました)私が最新のレコードから始めれば。

UPDATEdである列にはインデックスがありません。

ここで、aTRIGGERTRANSACTIONデフォルトであることがわかったので、代わりにprocを作成し、phpから呼び出します。

トランザクション分離レベルはREPEATABLE-READです。

私は、これらの重複UPDATEがデッドロックを引き起こし、完了するのに時間がかかること以外に何も起こらないことに関心があります。

すべてのテーブルInnoDB。

dであるテーブル内のすべてのIDを除いて、すべてSELECTのsとUPDATEsはPKid上でdです。参加しません。面倒なことはありません。難なく。 WHERECURSOR SELECTSELECTUPDATE

そうは言っても、ここに最後に質問があります:

  1. DECLARE'は1回SELECTだけSELECTですか、それともループしますか(1回SELECTだけの方がいいです)?
  2. DECLARE's SELECT'ロックはprocの期間中残りますか(できるだけ早く解放することをお勧めします)?
  3. クエリが終了するとすぐに各UPDATEリリースの行ロックが解除されますか、それともprocの期間中は保持されUPDATEますか(個々のクエリが終了した後に行ロックが解除されることをお勧めします)。
  4. ユーザー変数のSELECTsも、設定後に解放されますか(ご想像のとおり、できるだけ早く解放することをお勧めします)。
  5. SELECT行ロックを使用して行をdのままにすることは可能UPDATEですか(繰り返しますが、可能であれば私は好みます)?

よろしくお願いします!

なぜUPDATEすべてINSERT

私のウェブサイト(私のプロフィール)では、ユーザーが提出されたすべてのリンクにアクセスできるようにしています。これは順次問題ありません。IDを参照するだけです。

ただし、3つの投票タイプのカスタムアルゴリズムの組み合わせパーセンタイルでそれらをランク付けし、3を均等に重み付けします。

問題は、私のアルゴリズムでは、各投票が他のすべての投票に影響を与えることです。私のアルゴリズムの性質上、これを回避する方法はありません。

オンデマンド

PHPでそのルートを試しました。立ち入り禁止。計算が多すぎます。ページが自動的にユーザーのランクを更新し、ユーザーが賢くないので、ユーザーが正確なデータを即座に取得することにはあまり関心がありませんが、迅速な動的ページ付けを許可しているため、ユーザーを永遠に待たせることはできません。

ビューで計算することは、さらに大きな災害でした。

4

1 に答える 1

1
  • は1 回しか選択されませんが、残念ながら役に立ちませDECLARE...SELECT
  • SELECTカーソルは何かをロックしOPENたままにする可能性がありますCLOSE- それはストレージエンジンによって異なります: テーブル、ページ、行、または何もない可能性があります
  • UPDATE、更新が完了するまでロックされます。繰り返しますが、ストレージ エンジンに応じて、ロックはテーブル、ページ、または行のいずれかになります (ただし、何もないわけではありません)。

しかし、完全に異なるアプローチを検討することもできます: IIUC では、基本的にランキングまたはパーセンタイルの一致が必要であり、すべてのINSERT. これは、私の POV に大きな問題があります。大量の不要な値を計算します。読み取り操作のみで計算するとどうなるでしょうか。

  • 2 つの読み取り操作の間に常に 1 つだけ ある場合は、常にINSERT再計算する必要があります。これは、現在のように常に計算する場合と同じケースです。
  • 2 つの読み取り操作の間に s がない 場合INSERT、MySQL クエリ キャッシュは前の計算の結果を保持し、クエリを再実行しないため、計算量が少なくなります。
  • 2 つの読み取り操作の間に複数 のがある場合INSERT、N 個の挿入に対して 1 回だけ計算する必要があります。

したがって、オンデマンドでランク/パーセンタイルを計算することは、で計算するよりもコストがかかることはありませんがINSERT、大幅に安くなる可能性があります。

于 2013-01-09T00:34:21.637 に答える