通訊協(xié)議
? ? TCP/IP
????Unix Socket
通信方式
????單工:數(shù)據(jù)單向傳輸
????半雙工:數(shù)據(jù)雙向傳輸,但不能同時傳輸
????全雙工:數(shù)據(jù)雙賂傳輸,可以同時傳輸
架構(gòu)分層
? 連接層:管理連接、權(quán)限驗證等功能
??服務(wù)層:詞法分析、語法分析、執(zhí)行計劃生成、索引選擇、操作引擎、返回操作結(jié)果
? 存儲引擎層:存儲數(shù)據(jù),提供讀寫接口

體系結(jié)構(gòu)
連接池組件、管理服務(wù)和工具組件、SQL接口組件、查詢分析器組件
優(yō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),更新完成。
