0

我有一个应用程序需要每隔 2 秒评估一次“消息”。

每次运行此评估时,系统都设计为选择当前行和列数据,对其进行处理,然后将其更新回表中。该脚本的设置方式是更新所有字段,而不管实际更改与否(为了更清晰的编码)..就像这样:

  • 从 MESSAGES 表中选择所有行

  • 全球化变量

  • 从 MESSAGES_REMOTE 表中选择所有行

  • 全球化变量 // 这有效地覆盖了第一个表中的现有变量

  • 将所有变量更新到 MESSAGES 表中

现在,实际更新的列的范围可能从 1 variable 到 all variables ,具体取决于情况。

所以我想知道在尝试更新具有相同值的列时,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 会注意到这一点并且不会更新它。

这并不意味着没有开销。

通过打开一个连接,然后在单行上执行 1000 次更新,我在一个有 86 列的表上做了一些基准测试。

在方案 1 中,所有 86 列都设置为相同的值。这花了 557 毫秒。

在场景 2 中,只有 3 列设置为相同的值。这花了 290 毫秒。

所以,IO读取和CPU肯定有一些开销。

于 2014-03-05T10:56:38.307 回答