剖析MySQL黑盒----MySQL架構(gòu)設(shè)計(jì)

為何稱MySQL為黑盒?
對(duì)于大部分的開發(fā)人員而言,編寫增刪查改的sql語句通過數(shù)據(jù)庫(kù)連接去操作數(shù)據(jù)庫(kù),但并不關(guān)心數(shù)據(jù)庫(kù)是如何監(jiān)聽請(qǐng)求和從連接中把請(qǐng)求數(shù)據(jù)中提取出來,往往在意表結(jié)構(gòu),sql執(zhí)行效率慢就給他們建立索引,完全把MySQL當(dāng)作黑盒子去使用。
1. 網(wǎng)絡(luò)連接必須使用線程來處理
MySQL 使用內(nèi)部線程來實(shí)現(xiàn)監(jiān)聽和讀取請(qǐng)求。

2. SQL接口:負(fù)責(zé)處理接收到的sql語句
MySQL通過sql接口把我們平時(shí)編寫的sql語句簡(jiǎn)單化,讓我們輕松的學(xué)會(huì)和編寫sql語句,但其底層實(shí)現(xiàn)其實(shí)是非常復(fù)雜。當(dāng)工作線程接收到sql語句之后,會(huì)交給sql接口去執(zhí)行。

3. 查詢解釋器:讓MySQL看懂sql語句
MySQL是一個(gè)數(shù)據(jù)管理系統(tǒng),并不能像我們一樣直接讀懂sql語句,例如:
select id, name, age from users where id = 1
復(fù)制代碼
需要借助組件 查詢解析器 對(duì)sql語句進(jìn)行解析和拆解,拆解成以下幾部分:
from users: 我們需要從 users 表里面查詢數(shù)據(jù)
where id = 1 :查詢id字段值為1的那行數(shù)據(jù)
select id, name, age : 從查出來的那行數(shù)據(jù)中提取出 "id,name,age"三個(gè)字段

4. 查詢優(yōu)化器:選擇最優(yōu)的查詢路徑
查詢優(yōu)化器會(huì)根據(jù)sql生成查詢路徑樹,然后從里面選擇一條最優(yōu)的查詢路徑出來。

5. 調(diào)用存儲(chǔ)引擎接口,真正執(zhí)行sql語句
數(shù)據(jù)庫(kù)存儲(chǔ)的數(shù)據(jù),有可能存儲(chǔ)在磁盤上,有可能存儲(chǔ)在內(nèi)存中。那怎么判別查詢的數(shù)據(jù)存放在哪一個(gè)地方?存儲(chǔ)引擎根據(jù)執(zhí)行器的調(diào)度執(zhí)行sql邏輯,無論是從內(nèi)存緩存中查詢數(shù)據(jù),從磁盤中更新數(shù)據(jù),一系列操作全都由存儲(chǔ)引擎執(zhí)行。

6. 執(zhí)行器:根據(jù)執(zhí)行計(jì)劃調(diào)度存儲(chǔ)引擎
執(zhí)行器根據(jù)優(yōu)化器的執(zhí)行計(jì)劃去調(diào)用存儲(chǔ)引擎的各種接口來完成sql語句的執(zhí)行。

總結(jié):
在MySQL架構(gòu)設(shè)計(jì)中,SQL接口、SQL解析器、查詢優(yōu)化器、執(zhí)行器都是一套通用的組件,但是存儲(chǔ)引擎卻有不同的選擇,例如:InnoDB、MyISAM、Memory等,對(duì)應(yīng)不同的應(yīng)用場(chǎng)景,MySQL的默認(rèn)是 InnoDB,在后續(xù)會(huì)一步一步分析。所以綜上所述,MySQL的執(zhí)行sql語句的順序?yàn)椋簊ql接口->解析器:解釋sql->優(yōu)化器:生成執(zhí)行計(jì)劃->執(zhí)行器:執(zhí)行計(jì)劃去調(diào)用InnoDB存儲(chǔ)引擎接口執(zhí)行sql
Java幫幫
非盈利學(xué)習(xí)社區(qū)
官網(wǎng):www.javahelp.com.cn
職業(yè)司
職業(yè)司學(xué)習(xí)交流互動(dòng)開放社區(qū)
官網(wǎng):zhiyesi.com
