下边的实验简单说明上边的问题:
再做一个简单的实验:
mysql> select * from a;
+------+------+
| a | b |
+------+------+
| 10 | 2 |
| 10 | 3 |
| 10 | 101 |
+------+------+
3 rows in set (0.00 sec)
mysql> update a set b = 100;
Query OK, 3 rows affected (0.00 sec)
Rows matched: 3 Changed: 3 Warnings: 0
mysql> update a set b = 100;
Query OK, 0 rows affected (0.00 sec)
Rows matched: 3 Changed: 0 Warnings: 0
mysql> update a set b = 100 where a = 10;
Query OK, 0 rows affected (0.00 sec)
Rows matched: 3 Changed: 0 Warnings: 0
红色语句是不会产生innodb redo log write I/O的,因为update前后的值相同,更重要的是不会写innodb redo log的,这样其实就不受innodb_flush_log_at_trx_commit参数影响,这个通过status 变量Innodb_log_write_requests,Innodb_log_writes没有变化,和redo log文件修改时间没变,得到验证
中间相同的update语句没有引起数据块的变化,Innodb_rows_updated这个状态变量是不会发生变化。