架構(gòu)圖

image.png
其中 Server 層包括連接器、分析器、查詢緩存、優(yōu)化器、執(zhí)行器,執(zhí)行器通過API進(jìn)行調(diào)用不同實(shí)現(xiàn)的存儲(chǔ)引擎
連接器
負(fù)責(zé)跟客戶端建立連接、獲取權(quán)限、維持和管理連接
查詢緩存
- 查詢緩存指的是查詢到結(jié)果,以查詢語句為key,查詢結(jié)果為value進(jìn)行緩存起來,下次查詢發(fā)現(xiàn)相同查詢語句,就直接取緩存進(jìn)行返回。
- 適用場(chǎng)景:靜態(tài)數(shù)據(jù),比如中國(guó)國(guó)家城市信息,不適合更新頻繁的數(shù)據(jù),因?yàn)楦聲r(shí)需要將緩存清除,更大更新的負(fù)擔(dān),不建議使用。
- 備注:Mysql 8.0 已經(jīng)將查詢緩存功能刪除
分析器
分析器主要包括詞法分析和語法分析
- 詞法分析主要是識(shí)別出里面的字符串分別是什么,代表什么,比如 select 表示開始查詢
- 語法分析是將于SQL的語句是否符合語法規(guī)則,比如 delete * from t 就會(huì)報(bào)如下錯(cuò)誤:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '* from t' at line 1
優(yōu)化器
優(yōu)化器的工作主要是為了提升性能進(jìn)行相關(guān)的優(yōu)化處理,比如:
- 如果有多個(gè)索引時(shí),選擇哪個(gè)索引更加優(yōu),或者走二級(jí)索引還是走主鍵索引優(yōu)等(可能在這階段會(huì)因抽樣統(tǒng)計(jì)信息不準(zhǔn)導(dǎo)致選錯(cuò)索引)
- join 關(guān)聯(lián)時(shí),以哪個(gè)表作為基準(zhǔn)表會(huì)性能更高等
執(zhí)行器
執(zhí)行器就是開始執(zhí)行SQL,但是在開始執(zhí)行前會(huì)檢查用戶的權(quán)限,通過后再調(diào)用引擎接口進(jìn)行操作。舉個(gè)例子:
--- 創(chuàng)建表
CREATE TABLE t (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(255),
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 ;
-- 查詢
select * from t where name = 'helloworld';
- 執(zhí)行器調(diào)用存儲(chǔ)引擎API獲取第一行數(shù)據(jù),判斷name是否相同,如果不等,忽略,否則放在結(jié)果集里面
- 繼續(xù)調(diào)用存儲(chǔ)引擎API獲取“下一行”,重復(fù)第一步,直到?jīng)]有下一行
- 執(zhí)行器將結(jié)果集返回給客戶端
本文參考極客時(shí)間的Mysql實(shí)戰(zhàn)45講