1.mysql的組成
簡圖
FA77AB34A02F0399C8AA7B39EA010BA2.jpg
邏輯架構(gòu)
客戶端
PHP JAVA Go 等
服務(wù)層
連接器:管理連接登疗,權(quán)限驗證柏腻。
查詢緩存: 命中則直接返回結(jié)果。
分析器:詞法分析谴分,語法分析啡直。
優(yōu)化器:執(zhí)行計劃生成烁涌,索引選擇苍碟。
執(zhí)行器:操作引擎,返回結(jié)果撮执。
存儲引擎層
存儲引擎:存儲數(shù)據(jù)提供讀寫接口驰怎。
數(shù)據(jù)存儲層
主要是將數(shù)據(jù)存儲在運(yùn)行于裸設(shè)備的文件系統(tǒng)之上,并完成與存儲引擎的交互二打。
2.客戶端
首先以PHP為例連接mysql
$db = mysql_connect(ip:port,user,password);
這個php連接mysql語句就是客戶端工具县忌,用來跟數(shù)據(jù)庫服務(wù)端建立tcp連接。
3.連接器
當(dāng)客戶端和服務(wù)端建立起tcp握手后继效,連接器開始認(rèn)證身份症杏。
用戶名或密碼不對,會收到
Access denied for user
錯誤瑞信,客戶端結(jié)束執(zhí)行厉颤。
如通過,連接器在權(quán)限表中查出擁有的權(quán)限凡简。
連接完成后逼友,如果沒有后續(xù)的動作,這個連接就處于sleep狀態(tài)秤涩。
image.png
客戶端如果8小時(默認(rèn)時間,由wait_timeout控制)沒有動靜則自動斷開帜乞。
4. 查詢緩存
MySQL的查詢緩存是MySQL內(nèi)置的一種緩存機(jī)制。比如我們發(fā)送select * from user where name=tuzisir 這么一個查詢筐眷,MySQL首先檢索內(nèi)存中是否有數(shù)據(jù)并且數(shù)據(jù)是否過期黎烈,如果沒有數(shù)據(jù)或者數(shù)據(jù)已經(jīng)過期就去數(shù)據(jù)庫中查找,如果有數(shù)據(jù)并且沒有過期就直接返回數(shù)據(jù)匀谣。對于sql的匹配規(guī)則非常簡單照棋,就是字符串的比較,只要字符串相同武翎,那么就認(rèn)為是同一個查詢烈炭。
5.分析器
跟語言的分析是一樣的。
詞法分析: sql 關(guān)鍵詞是否正確
(拿php舉例宝恶,一條語句 if else 解析出這是正確的而不是 fi else)
語法分析: 格式是否正確
(拿php舉例符隙,一條語句 if else 解析出這是正確的而不是 else if)
6.優(yōu)化器
MySQL采用了基于開銷的優(yōu)化器,以確定處理查詢的最解方式卑惜,也就是說執(zhí)行查詢之前膏执,都會先選擇一條自以為最優(yōu)的方案,然后執(zhí)行這個方案來獲取結(jié)果露久。在很多情況下更米,MySQL能夠計算最佳的可能查詢計劃,但在某些情況下毫痕,MySQL沒有關(guān)于數(shù)據(jù)的足夠信息征峦,或者是提供太多的相關(guān)數(shù)據(jù)信息迟几,估測就不那么友好了。
7.執(zhí)行器
執(zhí)行器包括執(zhí)行查詢語句栏笆,返回查詢結(jié)果类腮,生成執(zhí)行計劃包括與存儲引擎的一些處理操作。
8.存儲引擎
InnoDb
MylSAM
Archive
Blackhole
CSV
Memory
Federated
Mrg_MylSAM
NDB集群