
mysql主要分為客戶端、Server層、存儲(chǔ)引擎層
Server層中存在連接器,緩存區(qū),詞法分析器,優(yōu)化器以及執(zhí)行器。其操作順序是連接校驗(yàn)權(quán)限后如果開啟了緩存區(qū)訪問(wèn)的話,會(huì)先訪問(wèn)緩存區(qū)中是否存在該語(yǔ)句注:緩存區(qū)的存儲(chǔ)結(jié)構(gòu)是key-value,key對(duì)應(yīng)的sql。如果緩存區(qū)中沒有會(huì)先經(jīng)過(guò)詞法分析器分析成功之后進(jìn)入優(yōu)化器,執(zhí)行器
redo log 和bin log的區(qū)別
bin log是一個(gè)邏輯日志,里面存儲(chǔ)的是更新語(yǔ)句的處理邏輯;redo log是一個(gè)物理日志,里面存儲(chǔ)的是更新語(yǔ)句的執(zhí)行結(jié)果。比如說(shuō)張三原本有100元,現(xiàn)在李四給其轉(zhuǎn)了200元,那么redo log中記錄的就是張三的300元。而Bin log對(duì)應(yīng)的是邏輯日志它記錄的就是100+200邏輯運(yùn)算的一個(gè)過(guò)程。Bin log是不限大小,追加寫入。而redo log是有一個(gè)限定的大小。其中bin log是可以用來(lái)將誤刪除的數(shù)據(jù)從日志中將其歸檔找回來(lái)。
redo log理解
redo log是Innodb引擎中特有的,執(zhí)行數(shù)據(jù)的寫入采用的是WAL機(jī)制(Write-Ahead Logging)先寫日志再寫磁盤。如果沒有采用wal機(jī)制的化每次都往磁盤文件中寫入數(shù)據(jù)是非常麻煩的,因?yàn)槲覀兊臄?shù)據(jù)在磁盤中是結(jié)構(gòu)化存儲(chǔ)的,當(dāng)插入數(shù)據(jù)的數(shù)據(jù)的時(shí)候先要查詢數(shù)據(jù)的存儲(chǔ)位置再寫入而使用了wal機(jī)制將其先寫入redo 日志中該機(jī)制里面還有一個(gè)檢查機(jī)制,待數(shù)據(jù)庫(kù)不忙的時(shí)候再將日志中的數(shù)據(jù)同步到磁盤文件中。其中redo log在mysql的data文件中對(duì)應(yīng)的是ib_logfile1和ib_logfile0
redolog寫入的原理
redo log在mysql的data文件夾中存在兩個(gè)文件,寫入的時(shí)候按照循環(huán)寫入的規(guī)則,先往文件1中寫入,文件1寫滿時(shí),切換到文件2中,如果兩個(gè)文件都寫滿此時(shí)checkpoint(當(dāng)前邊寫邊后移)會(huì)回到文件1中通知innodb引擎擦除已經(jīng)提交的日志。如果都沒有提交,此時(shí)的mysql會(huì)停下來(lái),先把文件1中的一部分?jǐn)?shù)據(jù)同步到數(shù)據(jù)表中才會(huì)接收新的更新任務(wù)