為何稱MySQL為黑盒?
對于大部分的開發(fā)人員而言拣展,編寫增刪查改的sql語句通過數(shù)據(jù)庫連接去操作數(shù)據(jù)庫悼尾,但并不關(guān)心數(shù)據(jù)庫是如何監(jiān)聽請求和從連接中把請求數(shù)據(jù)中提取出來廉侧,往往在意表結(jié)構(gòu),sql執(zhí)行效率慢就給他們建立索引啤握,完全把MySQL當(dāng)作黑盒子去使用鸟缕。
1. 網(wǎng)絡(luò)連接必須使用線程來處理
MySQL 使用內(nèi)部線程來實現(xiàn)監(jiān)聽和讀取請求。
2. SQL接口:負(fù)責(zé)處理接收到的sql語句
MySQL通過sql接口把我們平時編寫的sql語句簡單化排抬,讓我們輕松的學(xué)會和編寫sql語句懂从,但其底層實現(xiàn)其實是非常復(fù)雜。當(dāng)工作線程接收到sql語句之后畜埋,會交給sql接口去執(zhí)行莫绣。
3. 查詢解釋器:讓MySQL看懂sql語句
MySQL是一個數(shù)據(jù)管理系統(tǒng),并不能像我們一樣直接讀懂sql語句悠鞍,例如:
select id, name, age from users where id = 1
需要借助組件 查詢解析器 對sql語句進行解析和拆解对室,拆解成以下幾部分:
- from users: 我們需要從 users 表里面查詢數(shù)據(jù)
- where id = 1 :查詢id字段值為1的那行數(shù)據(jù)
- select id, name, age : 從查出來的那行數(shù)據(jù)中提取出 "id,name,age"三個字段
4. 查詢優(yōu)化器:選擇最優(yōu)的查詢路徑
查詢優(yōu)化器會根據(jù)sql生成查詢路徑樹,然后從里面選擇一條最優(yōu)的查詢路徑出來咖祭。
5. 調(diào)用存儲引擎接口掩宜,真正執(zhí)行sql語句
數(shù)據(jù)庫存儲的數(shù)據(jù),有可能存儲在磁盤上么翰,有可能存儲在內(nèi)存中牺汤。那怎么判別查詢的數(shù)據(jù)存放在哪一個地方?存儲引擎根據(jù)執(zhí)行器的調(diào)度執(zhí)行sql邏輯浩嫌,無論是從內(nèi)存緩存中查詢數(shù)據(jù)檐迟,從磁盤中更新數(shù)據(jù)补胚,一系列操作全都由存儲引擎執(zhí)行。
6. 執(zhí)行器:根據(jù)執(zhí)行計劃調(diào)度存儲引擎
執(zhí)行器根據(jù)優(yōu)化器的執(zhí)行計劃去調(diào)用存儲引擎的各種接口來完成sql語句的執(zhí)行追迟。
總結(jié):
在MySQL架構(gòu)設(shè)計中溶其,SQL接口、SQL解析器敦间、查詢優(yōu)化器瓶逃、執(zhí)行器都是一套通用的組件,但是存儲引擎卻有不同的選擇廓块,例如:InnoDB厢绝、MyISAM、Memory等带猴,對應(yīng)不同的應(yīng)用場景昔汉,MySQL的默認(rèn)是 InnoDB,在后續(xù)會一步一步分析拴清。
所以綜上所述挤庇,MySQL的執(zhí)行sql語句的順序為:
sql接口->解析器:解釋sql->優(yōu)化器:生成執(zhí)行計劃->執(zhí)行器:執(zhí)行計劃去調(diào)用InnoDB存儲引擎接口執(zhí)行sql
注明:
學(xué)習(xí)筆記總結(jié)于公棕號:儒猿技術(shù)窩。感興趣的同學(xué)可以前往關(guān)注贷掖。