mysql實戰45講學習筆記 02

2021-09-25 03:18:00 字數 1723 閱讀 3487

2.日誌系統:一條sql更新語句是如何執行的

一條查詢語句執行過程是經過聯結器,分析器,優化器,執行器等功能模組最後到達儲存引擎

查詢語句的流程,更新語句也是會同樣走一遍。

更新流程還涉及兩個重要的日誌系統,redo log(重做日誌)和binlog(歸檔日誌)。

重要的日誌模組:redo log

mysql裡常說的wal技術(write-ahead logging),關鍵點在先寫日誌,再寫磁碟;

具體來說,就是一條記錄需要跟新的時候,innodb引擎會先把記錄寫到redo log裡面,並更新記憶體,這時更新就算完成了,同時,innodb引擎會在適當的時候,將操作記錄更新到磁碟裡面。而這個更新是在系統比較空閒的時候做,

innodb的 redo log 是固定大小的,記錄滿了就迴圈。

writepos是當前記錄的位置,一邊寫一邊後移,寫到第三號檔案末尾後就又回到0號檔案開頭,checkpoint是當前要擦除的位置,也是往後推移並且迴圈的,擦除記錄權要把記錄更新到資料檔案。

write pos 和checkpoint之間空著的部分可以用來記錄新的操作,如果write pos 追上checkpoint ,這時候不能執行新的更新,得擦掉一些記錄,

redo log ,innodb就可以保證資料庫發生異常重啟,之前提交的記錄也不會丟失,這個能力稱為crash-safe(賒賬記錄在黑板生,停業幾天還是可以看見這些記錄)

重要的日誌模組,binlog

mysql整體來看兩層,server層主要做的是mysql功能層面的事,引擎層主要負責儲存相關的具體事宜。redo log是innodb 引擎特有的日誌,而server層也有自己的日誌,稱為binlog(歸檔日誌)

binlog和redo log之間的不同

1.redo log 是innodb特有的,binlog是mysql中server層實現,所有引擎都可以使用

2.redo log是物理日誌,記錄的是「在某個資料頁上做了什麼操作」binlog是邏輯日誌,記錄的是這個語句的原始邏輯

3.redo log實訓管寫的,空間固定會用完,binlog是可以追加寫入的,」追加寫」是指binlog檔案寫到一定大小後會切換到下乙個,並不會覆蓋以前日誌。

update的執行流程圖,淺色框表示是在innodb內部執行的,深色框表示實在執行器中執行的

redo log寫入拆成兩個步驟,prepare和commit。這就是兩階段提交

兩階段提交

為了讓兩份日誌之間的邏輯一致,這樣才可以讓資料庫恢復到半個月內任意一秒的狀態。

redo log和binlog都可以用來表示事務的提交狀態,而兩階段提交就是讓這兩個狀態保持邏輯上的一致。

redo log 用於保證crash-safe能力,innodb_flush_log_at_trx_commit這個引數設定成1的時候,表示每次事務的redo log 都直接持久化到磁碟。這樣可以保證mysql異常重啟後資料不丟失

sync_binlog 這個引數設定成1的時候,表示每次事務的binlog都持久化到磁碟,這樣可以保證mysql異常重啟購binlog不丟失。

問題

mysql實戰45講學習筆記 11

11 怎麼給字串欄位加索引字首索引的優勢,選取欄位前幾個作為索引,占用的空間更小 使用字首索引,定義好長度,就可以做到既節省空間,又不用額外增加太多的查詢成本。建立索引的時候關注的是區分度,區分度越高越好,區分度越高,意味著重複的鍵值越少,因此,可以通過統計索引上有多少不同的值來判斷使用多長字首。m...

mysql實戰45講學習筆記 12

為什麼我的mysql 抖 了一下一條sql語句,正常執行的時候特別快,但有時會突然變得特別慢,並且隨機,持續時間短。將對應的記憶體資料寫入到磁碟的過程,叫做flush。當記憶體資料頁跟磁碟資料頁內容不一致的時候,我們稱這個記憶體頁為 髒頁 記憶體資料寫入到磁碟後,記憶體和磁碟上的資料頁就一致,稱為 ...

mysql實戰45講學習筆記 15

15 日誌和索引相關問題1.在兩階段提交的不同瞬間,mysql如果發生異常重啟,是怎樣保證資料完整性的。如果在圖中a的地方,也就是寫入redo log處於prepare階段之後,寫binlog之前,發生了崩潰 crash 由於此時binlog還沒寫,redolog還沒提交,所以崩潰恢復的時候。事務會...