我有一个应用程序需要每2秒间隔评估一堆“消息”..
每次运行此评估时,系统都会设计为SELECT当前行和列数据,对其执行某些操作然后将其更新回表中。该脚本的设置方式是它更新所有字段而不管实际的变化与否(为了更清晰的编码)..就像这样:
从MESSAGES表中选择所有行
全球化变量
从MESSAGES_REMOTE表中选择所有行
全局化变量//这有效地覆盖了现有的变量 第一个表中的变量
将所有变量更新回MESSAGES表
现在,实际更新的列可能从1个变量到所有变量,具体取决于具体情况。
所以我想知道MYSQL在尝试更新具有相同值的列时是否会有相同的开销,或者是否有某种内部引擎来检查是否需要执行实际的更新/写入
答案 0 :(得分: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
答案 1 :(得分:0)
虽然http://dev.mysql.com/doc/refman/5.6/en/update.html提及:
如果将列设置为当前值,则MySQL会注意到这一点并且不会更新它。
这并不意味着没有开销。
我在一个包含86列的表上做了一些基准测试,通过打开一个连接,然后在一行上执行1000 UPDATE。
在方案1中,所有86列都设置为相同的值。这需要557毫秒。
在方案2中,只有3列设置为相同的值。这花了290毫秒。
因此,IO读取和CPU肯定会有一些开销。