3

より効率的で、より少ないリソースを使用するものを知っている人はいますか?

方法 1 -- 単一の SELECT ステートメントを使用して 1 つのテーブルからデータを取得し、それを反復処理して別のテーブルで複数の UPDATE を実行します。EG (疑似コード、execute() はクエリを実行):

Query1_resultset = execute("SELECT item_id, sum(views) as view_count FROM tableA WHERE condition=1");  
while(Query1_resultset as row) {  
   execute("UPDATE tableB SET view_count=row.view_count WHERE id=row.item_id");  
}


方法 2 -- 単一の INSERT.. ON DUPLICATE KEY UPDATE ステートメントを、ネストされた SELECT ステートメントと共に使用します。例えば:

INSERT INTO tableB (id, view_count) SELECT item_id, SUM(views) as view_count FROM tableA WHERE condition=1 ON DUPLICATE KEY UPDATE view_count=VALUES(view_count);

注: tableB の ID は主キーです。キーが存在することがわかっているため、実際には INSERTS はありません。したがって、すべての更新です。このステートメントを使用して、複数ではなく単一のクエリを渡すだけです。

どちらかがより効率的である理由について、私は本当に興味があります。実行速度を決定するのはクエリの数ですか? ボトルネックはどこですか?スケーリングできるものを探しています(更新される行の数は毎日増えます)。

何か案は?

ありがとう

4

2 に答える 2

2

更新/挿入の比率によって異なります。挿入が多く、更新が数回しかない場合は、INSERT ... ON DUPLICATE KEY UPDATEステートメントよりも高速になります。

主に更新がある場合は、フォールバックとしてステートメントと挿入を使用するよりも良いでしょうUPDATE(更新がない場合)。ちなみに、複数テーブルの更新句を使用して、選択の後に更新を行う代わりに、単一の更新でそれを行うことができます。SELECTaと an の両方を実行している場合はUPDATEINSERT間違いなく高速になります。

于 2010-09-20T18:29:22.423 に答える
0

より効率的だと思いますINSERT.. ON DUPLICATE KEY UPDATE(そうでなければ、そのような拡張機能を追加しても意味がありません)。ところで、最初の例は 2 番目の例とまったく同じではありません。トランザクションを使用することも、テーブルをロックすることもないため、 によって返されるレコードが、SELECT実行するまでに存在しない可能性がありますUPDATE

于 2010-09-20T18:26:20.990 に答える