Mysql架構(gòu)與執(zhí)行流程

通訊協(xié)議

? ? TCP/IP

????Unix Socket

通信方式

????單工:數(shù)據(jù)單向傳輸

????半雙工:數(shù)據(jù)雙向傳輸,但不能同時傳輸

????全雙工:數(shù)據(jù)雙賂傳輸,可以同時傳輸

架構(gòu)分層

? 連接層:管理連接、權(quán)限驗證等功能

??服務(wù)層:詞法分析、語法分析、執(zhí)行計劃生成、索引選擇、操作引擎、返回操作結(jié)果

? 存儲引擎層:存儲數(shù)據(jù),提供讀寫接口

架構(gòu)分層

體系結(jié)構(gòu)

連接池組件、管理服務(wù)和工具組件、SQL接口組件、查詢分析器組件

優(yōu)化組件、緩沖組件、插件式存儲引擎、物理文件

體系結(jié)構(gòu)

SQL查詢執(zhí)行流程

1、客戶端發(fā)送查詢請求

2、服務(wù)器優(yōu)先檢查查詢緩存,如果緩存存在,則返回存儲在緩存中的結(jié)果。

3、服務(wù)器端進行SQL解析、預(yù)處理、再由優(yōu)化器生成對應(yīng)執(zhí)行計劃。

4、執(zhí)行引擎根據(jù)優(yōu)化器生成的執(zhí)行計劃,調(diào)用存儲引擎的API來執(zhí)行查詢

5、將結(jié)果返回給客戶端。

SQL更新流程

update name = '張三'? where? ID = 2;

1、先找引擎取 ID=2 這一行。ID 是主鍵。如果 ID=2 這一行所在的數(shù)據(jù)頁本來就在內(nèi)存中,就直接返回給執(zhí)行器;否則,需要先從磁盤讀入內(nèi)存,然后再返回;

2、拿到引擎給的行數(shù)據(jù),把這個值賦上'張三',得到新的一行數(shù)據(jù),再調(diào)用引擎接口寫入這行新數(shù)據(jù);

3、將這行新數(shù)據(jù)更新到內(nèi)存中,同時將這個更新操作記錄到 redo log 里面,此時 redo log 處于 prepare 狀態(tài)。然后告知執(zhí)行器執(zhí)行完成了,隨時可以提交事務(wù);

4、執(zhí)行器生成這個操作的 binLog,并把 binLog 寫入磁盤;

5、執(zhí)行器調(diào)用引擎的提交事務(wù)接口,引擎把剛剛寫入的 redo log 改成提交(commit)狀態(tài),更新完成。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容