一、MySQL基礎(chǔ)架構(gòu)示意圖
二求泰、MySQL分層
總體來講,MySQL可以分為二層:Server層
和 存儲引擎
兩部分计盒,如下圖所示渴频。
不同的存儲引擎共用一個(gè)Server層。
三北启、各部分組件概述
連接器
負(fù)責(zé)與客戶端建立連接卜朗、獲取權(quán)限拔第、維持和管理連接。比如常規(guī)的連接MySQL Server的命令如下
mysql -h$ip -P$port -u$user -p
回車-->輸入密碼
- 命令中的mysql是客戶端工具场钉,用來與服務(wù)端建立連接蚊俺,通過TCP協(xié)議進(jìn)行連接。
-
MySQL客戶端
與Server連接器
連接成功后 進(jìn)行身份認(rèn)證逛万,若是認(rèn)證通過泳猬,連接器則會到權(quán)限表查詢用戶所擁有的權(quán)限。 - 一旦客戶端與Server之間成功建立連接宇植,當(dāng)前連接將會保持已查詢到的用戶權(quán)限得封,即使是管理員賬號對用戶權(quán)限做了修改,也不會影響已經(jīng)存在的連接權(quán)限指郁,即新權(quán)限對新的連接生效忙上。
- 連接完成后,若是沒有后續(xù)動作闲坎,則連接處于空閑狀態(tài)疫粥,可以通過
show processlis
命令查看連接的狀態(tài)。Command 列即為連接當(dāng)前所處的狀態(tài)箫柳。 - 客戶端若是長時(shí)間沒有使用手形,連接器會自動斷開連接,可通過參數(shù)
wait_timeout
來設(shè)置悯恍,默認(rèn)為8小時(shí)库糠。 - 若是客戶端與Server之間的連接 被連接器超時(shí)斷開后,客戶端再次發(fā)送請求時(shí)涮毫,則會收到“丟失連接”錯誤瞬欧,若是要繼續(xù)操作則需要進(jìn)行重連。
- 關(guān)于數(shù)據(jù)庫的連接
長連接
指連接成功后罢防,如果客戶端持續(xù)有請求艘虎,則一直使用同一個(gè)連接。
短連接
指 每次執(zhí)行完很少的幾次查詢就斷開連接咒吐,下次查詢再重新創(chuàng)建一個(gè)連接野建。
建立連接通常比較復(fù)雜 以及耗費(fèi)資源,因此恬叹,在使用過程中要盡量減少建立連接的動作候生,即 盡量使用長連接。 - 關(guān)于使用長連接時(shí)绽昼,有些時(shí)候MySQL占用內(nèi)存增長很快的問題
原因
MySQL在執(zhí)行過程中臨時(shí)使用的內(nèi)存是管理在連接對象里面的唯鸭,被占用的內(nèi)存資源 是在連接斷開的時(shí)候才釋放。
后果
長連接隨著使用時(shí)間不斷累積下來硅确,可能導(dǎo)致內(nèi)存占用太大目溉,被系統(tǒng)強(qiáng)制殺掉(OOM)明肮,從表現(xiàn)上來看就是MySQL異常重啟了。
解決方案
1). 定期斷開長連接缭付。 使用一段時(shí)間柿估、或者程序中判斷執(zhí)行過一個(gè)占用內(nèi)存大的查詢后,斷開連接蛉腌,之后查詢再重連官份。
2). 如果使用的是MySQL 5.7或更高版本,可以在每次執(zhí)行一個(gè)比較大的操作后烙丛,通過mysql_reset_connection
來重新初始化連接資源(釋放連接所占用的內(nèi)存資源)。
這個(gè)重置連接的操作羔味,不需要重連和重新做權(quán)限驗(yàn)證河咽,但是可以將連接恢復(fù)到新創(chuàng)建完連接時(shí)的狀態(tài)。
查詢緩存
在客戶端與MySQL Server建立連接后赋元,就可以進(jìn)行DML等操作了忘蟹。
- MySQL中,對于之前執(zhí)行過的語句及其結(jié)果 可能會以
key-value
對的形式被直接緩存在內(nèi)存中搁凸,key為查詢語句媚值,value是查詢結(jié)果。 - MySQL收到查詢請求時(shí)护糖,會先到查詢緩存查找:
若命中緩存key褥芒,則直接返回value結(jié)果給客戶端,MySQL不需要繼續(xù)執(zhí)行后面的操作——效率高嫡良;
若語句不在查詢緩存中锰扶,則會執(zhí)行后面的各執(zhí)行階段。執(zhí)行完成后寝受,執(zhí)行結(jié)果被保存到查詢緩存中坷牛。 - 大多數(shù)情況下不建議使用查詢緩存——>>查詢緩存的使用 往往
弊大于利
。
為什么?——查詢緩存的失效非常頻繁很澄,只要有對一個(gè)表有更新京闰,則這個(gè)表上的所有查詢緩存都會被清空。 對于更新頻繁的數(shù)據(jù)庫來說甩苛,查詢緩存的命中率非常低蹂楣。
MySQL提供了按需使用的方式,通過query_cache_type
參數(shù)來設(shè)置是否開啟查詢緩存浪藻。(注意:MySQL 8.0 版本直接將查詢緩存功能去掉了)
query_cache_type
參數(shù)值選項(xiàng):
DEMAND
對于默認(rèn)的SQL語句都不使用查詢緩存捐迫。
SQL_CACHE
對于確定要使用查詢緩存的語句顯示指定。如下命令
mysql> select SQL_CACHE * from T where ID=10爱葵;
分析器
分析器對客戶端提交過來的SQL語句進(jìn)行解析施戴。
首先反浓,進(jìn)行詞法分析
。對語句字符串進(jìn)行拆解赞哗,識別出數(shù)據(jù)庫保留關(guān)鍵字雷则、表、列 等肪笋。
其次月劈,對詞法分析的的結(jié)果做語法分析
。語法分析器根據(jù)語法規(guī)則藤乙,判斷輸入的SQL是否滿足MySQL語法猜揪。如果SQL語句不對,則會收到“語法錯誤”提醒坛梁。
優(yōu)化器
通過分析器而姐,MySQL就知道要干什么了。 但是在執(zhí)行之前划咐,需要經(jīng)過優(yōu)化器的處理拴念。
優(yōu)化器的處理范疇:
- 在表里有多個(gè)索引的時(shí)候,決定使用哪個(gè)索引褐缠;
- 在一個(gè)關(guān)聯(lián)查詢語句中政鼠,決定各個(gè)表的連接順序 等。
優(yōu)化器的作用——決定使用哪種方案進(jìn)行查詢队魏。
優(yōu)化器如何選擇索引公般,是否會選錯索引 等問題 后續(xù)講解。
執(zhí)行器
- MySQL通過【分析器】知道了要干什么器躏,通過【優(yōu)化器】知道了該怎么做俐载,于是執(zhí)行階段開始執(zhí)行語句。
分析器——知道要干什么
優(yōu)化器——知道該怎么做
執(zhí)行器——執(zhí)行語句 - 執(zhí)行器在執(zhí)行語句時(shí)登失,需要做權(quán)限檢查遏佣,有權(quán)限則打開表繼續(xù)執(zhí)行,打開表時(shí)揽浙,執(zhí)行器根據(jù)表的引擎定義状婶,去選擇該引擎提供的接口。
- 在數(shù)據(jù)庫的慢查詢?nèi)罩局邢谙铮幸粋€(gè)
rows_examined
字段膛虫,表示這個(gè)語句執(zhí)行過程中掃描了多少行,該值在執(zhí)行器每次調(diào)用引擎獲取數(shù)據(jù)行的時(shí)候進(jìn)行累加钓猬。
在有的場景下稍刀,執(zhí)行器調(diào)用一次,在引擎內(nèi)部則掃描了多行,因此——引擎掃描行數(shù) 與rows_examined
并不完全相同账月。
四综膀、小結(jié)
MySQL邏輯架構(gòu)簡述,通過一個(gè)SQL的完整執(zhí)行流程的各個(gè)階段有一個(gè)初步印象局齿。
五剧劝、思考題
如果表T中沒有字段K,而執(zhí)行如下語句抓歼,則會報(bào)“不存在這個(gè)列”的錯誤讥此,這個(gè)錯誤是在上面提到的哪個(gè)階段報(bào)出來的呢?
select * from T where k=1;
解答:分析器谣妻。Oracle會在分析階段判斷語句是否正確萄喳,表是否存在,列是否存在等蹋半,MySQL也這樣取胎。
六、評論區(qū)筆記與問題
筆記1
1湃窍,連接
連接管理模塊,接收請求匪傍;連接進(jìn)程和用戶模塊您市,通過,連接線程和客戶端對接
2役衡,查詢
查詢緩存 Query Cache
分析器茵休,內(nèi)建解析樹,對其語法檢查手蝎,先from榕莺,再on,再join棵介,再where......钉鸯;檢查權(quán)限,生成新的解析樹邮辽,語義檢查(沒有字段k在這里)等
優(yōu)化器唠雕,將前面解析樹轉(zhuǎn)換成執(zhí)行計(jì)劃,并進(jìn)行評估最優(yōu)
執(zhí)行器吨述,獲取鎖岩睁,打開表,通過meta數(shù)據(jù)揣云,獲取數(shù)據(jù)
3捕儒,返回結(jié)果
返回給連接進(jìn)程和用戶模塊,然后清理邓夕,重新等待新的請求刘莹。
筆記2
1阎毅、mysql主要組成部分:連接器,分析器栋猖,優(yōu)化器净薛,執(zhí)行器,存儲引擎蒲拉。
2肃拜、連接器:驗(yàn)證賬號密碼,維持鏈接雌团,超時(shí)自動斷開燃领,鏈接過程復(fù)雜,建議使用長鏈接锦援,連接比較占用內(nèi)存猛蔽,需要定時(shí)斷開,5.7之后可以使用mysql_reset_connection灵寺。
3曼库、分析器:驗(yàn)證語法的合規(guī)性,把sql轉(zhuǎn)換成mysql內(nèi)部識別的語句略板,表明轉(zhuǎn)換成對應(yīng)的id毁枯。
4、優(yōu)化器:判斷sql內(nèi)部的執(zhí)行順序叮称。
5种玛、執(zhí)行器:驗(yàn)證操作庫表是否有權(quán)限,調(diào)存儲引擎接口查詢數(shù)據(jù)瓤檐。
6赂韵、慢查詢?nèi)罩緍ows_examined,記錄查詢的時(shí)候掃描了多少行挠蛉,相同表有肯能次數(shù)不同祭示。
問題1
1、客戶端連接MySQL時(shí)碌秸,有時(shí)候會突然斷開绍移,然后又自動恢復(fù)的情況,修改 <code>connection_timeout </code> 參數(shù)讥电?
connection_timeout
指的是“連接過程中”的等待時(shí)間蹂窖;
wait_timeout
指的是“連接完成后,使用過程中”的等待時(shí)間恩敌。
問題2
1.MySQL的框架有幾個(gè)組件, 各是什么作用?
2.Server層和存儲引擎層各是什么作用?
3.you have an error in your SQL syntax 這個(gè)保存是在詞法分析里還是在語法分析里報(bào)錯?
4.對于表的操作權(quán)限驗(yàn)證在哪里進(jìn)行?
5.執(zhí)行器的執(zhí)行查詢語句的流程是什么樣的?
本文由博客一文多發(fā)平臺 OpenWrite 發(fā)布瞬测!