mysql主要分為客戶端、Server層寻拂、存儲引擎層
Server層中存在連接器程奠,緩存區(qū),詞法分析器祭钉,優(yōu)化器以及執(zhí)行器瞄沙。其操作順序是連接校驗權限后如果開啟了緩存區(qū)訪問的話,會先訪問緩存區(qū)中是否存在該語句注:緩存區(qū)的存儲結(jié)構是key-value慌核,key對應的sql距境。如果緩存區(qū)中沒有會先經(jīng)過詞法分析器分析成功之后進入優(yōu)化器,執(zhí)行器
redo log 和bin log的區(qū)別
bin log是一個邏輯日志垮卓,里面存儲的是更新語句的處理邏輯垫桂;redo log是一個物理日志,里面存儲的是更新語句的執(zhí)行結(jié)果粟按。比如說張三原本有100元诬滩,現(xiàn)在李四給其轉(zhuǎn)了200元,那么redo log中記錄的就是張三的300元钾怔。而Bin log對應的是邏輯日志它記錄的就是100+200邏輯運算的一個過程碱呼。Bin log是不限大小蒙挑,追加寫入宗侦。而redo log是有一個限定的大小。其中bin log是可以用來將誤刪除的數(shù)據(jù)從日志中將其歸檔找回來忆蚀。
redo log理解
redo log是Innodb引擎中特有的矾利,執(zhí)行數(shù)據(jù)的寫入采用的是WAL機制(Write-Ahead Logging)先寫日志再寫磁盤姑裂。如果沒有采用wal機制的化每次都往磁盤文件中寫入數(shù)據(jù)是非常麻煩的,因為我們的數(shù)據(jù)在磁盤中是結(jié)構化存儲的男旗,當插入數(shù)據(jù)的數(shù)據(jù)的時候先要查詢數(shù)據(jù)的存儲位置再寫入而使用了wal機制將其先寫入redo 日志中該機制里面還有一個檢查機制舶斧,待數(shù)據(jù)庫不忙的時候再將日志中的數(shù)據(jù)同步到磁盤文件中。其中redo log在mysql的data文件中對應的是ib_logfile1和ib_logfile0
redolog寫入的原理
redo log在mysql的data文件夾中存在兩個文件察皇,寫入的時候按照循環(huán)寫入的規(guī)則茴厉,先往文件1中寫入,文件1寫滿時什荣,切換到文件2中矾缓,如果兩個文件都寫滿此時checkpoint(當前邊寫邊后移)會回到文件1中通知innodb引擎擦除已經(jīng)提交的日志。如果都沒有提交稻爬,此時的mysql會停下來嗜闻,先把文件1中的一部分數(shù)據(jù)同步到數(shù)據(jù)表中才會接收新的更新任務