0

2秒間隔ごとに一連の「メッセージ」を評価する必要があるアプリケーションがあります..

この評価が実行されるたびに、システムは現在の行と列のデータを SELECT し、それに対して何らかの処理を行ってからテーブルに更新するように設計されています。スクリプトは、実際の変更に関係なくすべてのフィールドを更新するように設定されています (よりクリーンなコーディングのために) .. 次のようになります。

  • MESSAGES テーブルからすべての行を選択する

  • 変数をグローバル化する

  • MESSAGES_REMOTE テーブルからすべての行を選択

  • 変数をグローバル化 // これにより、最初のテーブルの既存の変数が効果的に上書きされます

  • すべての変数を MESSAGES テーブルに UPDATE します。

現在、実際に更新される列は、状況に応じて、1 つの変数からすべての変数の範囲になる場合があります。

したがって、同じ値で列を更新しようとしたときにMYSQLに同じオーバーヘッドがあるかどうか、または実際の更新/書き込みを実行する必要があるかどうかを確認するための何らかの内部エンジンがあるかどうか疑問に思っていました

4

2 に答える 2

1

これはあなたの質問に答えていますか?

 SELECT * FROM user;
 +---------+----------+
 | user_id | username |
 +---------+----------+
 |     101 | Adam     |
 |     102 | Ben      |
 |     103 | Charlie  |
 |     104 | Dave     |
 +---------+----------+
 4 rows in set (0.01 sec)

 UPDATE user SET username = 'Adam' WHERE user_id = 101;
 Query OK, 0 rows affected (0.18 sec)
 Rows matched: 1  Changed: 0  Warnings: 0
于 2013-04-16T15:37:07.050 に答える
0

http://dev.mysql.com/doc/refman/5.6/en/update.htmlでは次のことが言及されています。

列を現在の値に設定すると、MySQL はこれを認識し、更新しません。

オーバーヘッドがないわけではありません。

接続を開き、1 行で 1000 回の UPDATE を実行して、86 列のテーブルでベンチマークを行いました。

シナリオ 1 では、86 列すべてが同じ値に設定されます。これには 557 ミリ秒かかりました。

シナリオ 2 では、3 つの列のみが同じ値に設定されます。これには 290 ミリ秒かかりました。

したがって、IO 読み取りと CPU には間違いなくいくらかのオーバーヘッドがあります。

于 2014-03-05T10:56:38.307 に答える