Mysql的架構(gòu)設(shè)計
Mysql分為Server層和存儲引擎層:
Server層
主要包括連接器、查詢緩存、分析器、優(yōu)化器、執(zhí)行器等,涵蓋 MySQL 的大多數(shù)核心服務(wù)功能,以及所有的內(nèi)置函數(shù)(如日期、時間、數(shù)學(xué)和加密函數(shù)等),所有跨存儲引擎的功能都在這一層實現(xiàn),比如存儲過程、觸發(fā)器、視圖等。
存儲引擎層
存儲引擎層負責(zé)數(shù)據(jù)的存儲和提取。其架構(gòu)模式是插件式的,支持 InnoDB、MyISAM、Memory 等多個存儲引擎?,F(xiàn)在最常用的存儲引擎是 InnoDB,它從 MySQL 5.5.5 版本開始成為了默認存儲引擎。也就是說如果我們在create table時不指定表的存儲引擎類型,默認會給你設(shè)置存儲引擎為InnoDB。
server層的執(zhí)行過程:
連接器
首先連接器會判斷該用戶提交的SQL是否有權(quán)限,如果有權(quán)限才會進行后續(xù)的執(zhí)行操作,連接器負責(zé)跟客戶端建立連接、獲取權(quán)限、維持和管理連接。
查詢緩存
對于有相同查詢條件的請求會在查詢緩存中判斷是否有之前請求的緩存結(jié)果。之前執(zhí)行過的語句及其結(jié)果可能會以 key-value 對的形式,被直接緩存在內(nèi)存中。key 是查詢的語句,value 是查詢的結(jié)果。如果你的查詢能夠直接在這個緩存中找到 key,那么這個 value 就會被直接返回給客戶端。如果語句不在查詢緩存中,就會繼續(xù)后面的執(zhí)行階段。執(zhí)行完成后,執(zhí)行結(jié)果會被存入查詢緩存中??梢钥吹?,如果查詢命中緩存,MySQL 不需要執(zhí)行后面的復(fù)雜操作,就可以直接返回結(jié)果,這個效率會很高。
分析器
如果本次請求沒有緩存命中,在分析器中用以進行詞法和語法的分析,如果不符合規(guī)范則會拋出異常。
優(yōu)化器
詞法語法分析正常的話會進行優(yōu)化器處理,在這個階段會進過成本代價分析后,選擇合適的索引。
執(zhí)行器
最后調(diào)用選擇的存儲引擎來進行數(shù)據(jù)的查詢和更新等操作。
InnoDB存儲引擎的執(zhí)行過程
- 執(zhí)行一句SQL,先從考慮從內(nèi)存中的buffer pool加載所需的記錄數(shù)據(jù),如果buffer pool沒有相關(guān)數(shù)據(jù),就會從磁盤中將包含該記錄的頁加載到buffer pool中來;
- 在buffer pool中將記錄舊值寫到undo log中,undo log是InnoDB存儲引擎特有的日志類型,防止SQL執(zhí)行失敗需要回滾數(shù)據(jù),如果失敗直接從undo log中恢復(fù)即可;
- 在buffer pool中將舊值更新為新值,并將新值寫入到redo log中,undo log也是InnoDB存儲引擎特有的日志類型,防止SQL執(zhí)行的結(jié)果還沒有刷盤到磁盤中數(shù)據(jù)庫服務(wù)crash掉,如果這樣可以從undo log中重做;
- 將SQL執(zhí)行的操作信息寫入到binlog中,binlog按時刷盤寫入到磁盤中,binlog是server層的機制,任何存儲引擎都存在的機制;
- SQL執(zhí)行完成;
undo log和redo log
- redo log是重做日志。保存的是一個事務(wù)T在進行X操作后的新值N,可以表示為:<T,X,N>,是innodb存儲引擎特有的,支持crash之后恢復(fù)沒有刷盤的數(shù)據(jù)恢復(fù)。
- undo log是回退日志。保存的是一個事務(wù)T在進行Y操作后的老值O,可以表示為:<T,Y,O>,是innodb存儲引擎特有的,支持事務(wù)失敗后進行事務(wù)回滾。
binlog
- bin日志是mysql運行的日志,里面記錄了mysql運行的操作,他是在server層實現(xiàn)的日志。保存的是邏輯日志,即保存的是sql語句,通過bin 日志做數(shù)據(jù)恢復(fù)。也可以保存實際的數(shù)據(jù)格式。
buffer pool
mysql執(zhí)行一句更新操作的數(shù)據(jù)不會立即寫入磁盤,會先放到buffer pool中,這是內(nèi)存中的一片暫存區(qū),等一段時間會刷入磁盤中。這樣設(shè)計的作用是提高讀寫數(shù)據(jù)的效率。文章來源:http://www.zghlxwxcb.cn/news/detail-693715.html
WAL機制
WAL是先寫日志再進行刷盤操作,就是會先將操作寫入到redo log+binlog中,再將buffer pool中數(shù)據(jù)刷入磁盤;這樣做的優(yōu)勢是:(1)保障數(shù)據(jù)不會丟失。及時數(shù)據(jù)服務(wù)crash,也能從redo log中進行恢復(fù);(2)由于刷盤操作是順序操作,相對于隨機寫的效率會高很多;(3)實際修改先寫入buffer pool中,等內(nèi)存滿了在刷盤,這樣明顯降低了IO次數(shù),提升了IO效率。文章來源地址http://www.zghlxwxcb.cn/news/detail-693715.html
到了這里,關(guān)于Mysql數(shù)據(jù)庫(3)—架構(gòu)和日志的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!