innodb 的 redo log,不會對未引起資料塊變化的sql做記錄的

bulletming發表於2019-04-13

下邊的實驗簡單說明上邊的問題:


再做一個簡單的實驗:

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這個狀態變數是不會發生變化。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/82392/viewspace-144704/,如需轉載,請註明出處,否則將追究法律責任。

相關文章