innodb 的 redo log,不会对未引起数据块变化的sql做记录的

下边的实验简单说明上边的问题:


再做一个简单的实验:

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_requestsInnodb_log_writes没有变化,和redo log文件修改时间没变,得到验证

中间相同的update语句没有引起数据块的变化,Innodb_rows_updated这个状态变量是不会发生变化。

请使用浏览器的分享功能分享到微信等