天天看點

redo log的用途

1. 用途

保證資料的更新操作不丢失,同時保證了性能

2. 如何沒有redo log,如何保證資料庫的更新操作不會由于資料庫的當機而丢失?

對資料庫進行修改,應該是先從磁盤讀取資料到記憶體中,然後在記憶體中對資料進行修改,然後再将資料寫入到磁盤中,這樣才能資料庫

才能傳回資料修改成功

按照資料庫處理流程來說,首先應該是通過連接配接器接收到一條SQL語句,然後解析器對這條SQL進行詞法解析,然後由優化器生成一個

執行計劃,接下來就交由執行器來執行這個計劃,執行器将會調用引擎接口進而實作更新操作

這裡就存在一個問題,記憶體中不存在要修改的資料所在的資料頁,此時就要将該資料頁從磁盤中讀取出來,然後修改完成之後,為了防止

資料庫奔潰,就需要将資料寫入磁盤中,從這個角度來看,一次資料庫的更新操作,就要操作兩次磁盤了

3. 如何使用redo log來保證更新操作的不丢失?

資料修改成功之後,就需要将該資料頁刷到磁盤中去,以防丢失,但是現在已經引入了redo log,此時隻需要這個修改資訊寫入到redo log當中,也就是将哪個資料頁哪裡發生了修改寫入到redo log當中,而不需要将修改過的整個資料頁刷到磁盤當中去

4. 寫redo log同樣也是一次磁盤的寫操作,憑什麼說它的性能就更高一點呢?

寫redo log還有刷資料頁到磁盤中去,都是磁盤的的寫操作,但是呢,将修改資訊寫入到redo log當中,隻需要資料順序寫入redo log

當中,這裡其實就是一次順序寫磁盤的操作.

而将資料頁刷到磁盤中,因為一個修改操作可能會同時修改多個資料頁,這些資料頁又不是連續的,此時就意味着随機寫磁盤

并且,對于MySQL來說,一個資料頁是16kb,可能一次性更新多個資料頁,此時可能需要随機寫入幾百k的資料

而對于redo log,一次修改可能隻需要寫入幾k的資料,資料量相對于刷資料頁的方式是大大減少的

比較一下寫redo log和刷資料頁,寫redo log是磁盤的順序寫,小資料量,而刷資料頁到磁盤可能就意味着随機寫,而且還是

大資料量的,兩者一比較,寫redo log的性能可能比刷資料頁的性能高100倍

5. 綜上所述,redo log能夠在保證資料不丢失的時候,同時保證了性能