mysql基礎(chǔ)架構(gòu)

如果能夠清楚知道的架構(gòu)圖以及各個(gè)組件之間的關(guān)聯(lián)母截,會(huì)有助于深入理解mysql济蝉,如下是其的架構(gòu)圖

mysql-framework.png

圖中可以看出mysql分為service層和存儲(chǔ)引擎層:

service層包含了mysql大多數(shù)核心功能旦部,除了圖中標(biāo)注的連接器,查詢緩存,分析器罐旗,優(yōu)化器,執(zhí)行器唯蝶,還有所有的內(nèi)置函數(shù)(日期九秀,時(shí)間,數(shù)學(xué)和加密函數(shù))粘我,所有跨存儲(chǔ)引擎的功能都在這一層實(shí)現(xiàn):存儲(chǔ)過(guò)程鼓蜒、觸發(fā)器、視圖等征字。

存儲(chǔ)引擎層負(fù)責(zé)mysql中數(shù)據(jù)的存儲(chǔ)和提取都弹。和Linux下的各種文件系統(tǒng)一樣,每個(gè)存儲(chǔ)引擎都有自己的優(yōu)勢(shì)和劣勢(shì)柔纵,各種存儲(chǔ)引擎通過(guò)提供API和service層對(duì)接缔杉,通過(guò)API屏蔽各種存儲(chǔ)引擎之間的差異。常見(jiàn)的存儲(chǔ)引擎有InnoDB搁料、MyISAM或详、Memory,現(xiàn)在最常用的是InnoDB郭计,也是從mysql5.5版本開始成為默認(rèn)的存儲(chǔ)引擎霸琴,在5.5之前默認(rèn)的是MyISAM

1. 連接器

連接器是mysql service層的第一個(gè)模塊,也是處理客戶端請(qǐng)求的模塊昭伸。

客戶端和服務(wù)端的連接是使用經(jīng)典的tcp協(xié)議梧乘,經(jīng)過(guò)tcp握手之后,連接器開始進(jìn)行身份驗(yàn)證

登錄命令

mysql -h$ip -P$port -u$user -p
  • 如果賬號(hào)或者密碼錯(cuò)誤,會(huì)提示Access denied for user
mysql-login-error.png
  • 如果正確則認(rèn)證通過(guò)选调,之后會(huì)查詢當(dāng)前用戶的權(quán)限夹供,之后用戶的操作都是在這個(gè)權(quán)限范圍中,如果在連接期間修改權(quán)限也是無(wú)效的仁堪,需要重新連接才會(huì)生效哮洽。
    如下命令也是可以的,但是這種命令會(huì)把密碼暴漏出來(lái)弦聂,建議還是使用如上圖方式鸟辅,采用交互交互輸入密碼更安全
mysql -h$ip -P$port -u$user -p$password

2. 查詢緩存

了解即可,mysql8.0版本就去除緩存模塊了

客戶端發(fā)送一個(gè)sql查詢請(qǐng)求后莺葫,會(huì)先去緩存中查看是否存在匪凉。如果之前這條sql已經(jīng)執(zhí)行過(guò),而且結(jié)果緩存起來(lái)捺檬,那么這次查詢就會(huì)直接從緩存中獲取結(jié)果返回再层,不會(huì)在走分析器,優(yōu)化器堡纬,執(zhí)行器树绩。如果緩存中沒(méi)有命中,才會(huì)繼續(xù)走后面的模塊隐轩。

緩存以key-value的形式存儲(chǔ)饺饭,存放在一個(gè)引用表中海诲,key是通過(guò)一個(gè)哈希值的引用躬络,這個(gè)哈希值包括查詢本身(sql),當(dāng)前要查詢的數(shù)據(jù)庫(kù),客戶端協(xié)議的版本等一些其他會(huì)影響返回結(jié)果的的信息坯沪;查詢結(jié)果作為value(任何字符上的變化悴灵,例如空格扛芽,注釋都會(huì)導(dǎo)致緩存不命中)。

如果表被更改积瞒,所有的緩存都將失效川尖,表的更改是指數(shù)據(jù)的改變和表結(jié)構(gòu)的改變,包括INSERT茫孔、UPDATE叮喳、 DELETE、TRUNCATE缰贝、ALTER TABLE馍悟、DROP TABLE或DROP DATABASE等。

對(duì)于經(jīng)常變更的數(shù)據(jù)庫(kù)來(lái)說(shuō)緩存命中率就很低了 剩晴,查詢緩存往往弊大于利锣咒,所以不建議使用mysql的緩存侵状,而對(duì)于長(zhǎng)時(shí)間不變化的表可以使用redis緩存。mysql在8.0就完全去掉查詢緩存模塊了毅整。

3. 分析器

我們根據(jù)mysql語(yǔ)法寫出來(lái)一個(gè)sql之后交給服務(wù)層趣兄,分析器對(duì)sql語(yǔ)句進(jìn)行詞法分析和語(yǔ)法分析。

Mysql通過(guò)識(shí)別字符串中列名悼嫉、表名诽俯、where、select/update/insert 等mysql關(guān)鍵字承粤,在根據(jù)語(yǔ)法規(guī)則判斷sql是否滿足語(yǔ)法,最終會(huì)生成一個(gè)抽象語(yǔ)法樹(AST)闯团。

mysql分析器使用mysql語(yǔ)法規(guī)則驗(yàn)證和解析查詢辛臊,例如驗(yàn)證是否使用錯(cuò)誤的關(guān)鍵字或者使用關(guān)鍵字的順序是否正確,再或者會(huì)驗(yàn)證引號(hào)是否能前后正確匹配房交。

如果關(guān)鍵字有誤會(huì)提示You have an error in your SQL syntax的信息彻舰,具體錯(cuò)誤需要關(guān)注use near后的內(nèi)容

mysql> elect * from iam_user where id = 0;
ERROR 1064 (42000): 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 'elect * from iam_user where id = 0' at line 1

4. 優(yōu)化器

經(jīng)過(guò)分析器生成的語(yǔ)法樹被認(rèn)為是合法的,并由優(yōu)化器轉(zhuǎn)化成執(zhí)行計(jì)劃

mysql判斷出了這條sql需要做什么之后候味,對(duì)其進(jìn)行各種優(yōu)化刃唤,包括重寫查詢,決定表的讀取順序白群,以及選擇合適的索引等尚胞。

mysql使用基于成本的優(yōu)化的優(yōu)化器,嘗試預(yù)測(cè)一個(gè)查詢使用某種執(zhí)行計(jì)劃時(shí)的成本帜慢,選擇最小的那一個(gè)笼裳。

例如表中有多個(gè)索引的時(shí)候決定使用哪一個(gè);使用聯(lián)合索引的時(shí)候,會(huì)根據(jù)所以調(diào)整where條件的順序粱玲;

如果想知道優(yōu)化器是怎么進(jìn)行優(yōu)化決策的躬柬,可以通過(guò)explain獲取優(yōu)化的信息,explain具體的使用和解釋后面章節(jié)會(huì)說(shuō)明的抽减。

5. 執(zhí)行器

調(diào)用存儲(chǔ)引擎的API操作數(shù)據(jù)

優(yōu)化器完成sql的優(yōu)化后允青,提供一個(gè)執(zhí)行計(jì)劃給執(zhí)行器,執(zhí)行器開始執(zhí)行這個(gè)執(zhí)行計(jì)劃來(lái)操作數(shù)據(jù)卵沉。

執(zhí)行查詢階段:mysql只是簡(jiǎn)單的根據(jù)執(zhí)行計(jì)劃給出的指令逐步執(zhí)行颠锉,通過(guò)調(diào)用存儲(chǔ)引擎實(shí)現(xiàn)的接口來(lái)完成的。

總結(jié):用一個(gè)sql的執(zhí)行過(guò)程來(lái)總結(jié)下

mysql-select-path.png
  • 客戶端發(fā)送一條查詢給服務(wù)器史汗。

  • 服務(wù)器先檢查查詢緩存木柬,如果命中緩存則直接返回緩存中的結(jié)果。否則進(jìn)入下一階段淹办。

  • 服務(wù)器進(jìn)行sql解析眉枕,預(yù)處理,再由優(yōu)化器生成執(zhí)行計(jì)劃。

  • mysql根據(jù)執(zhí)行計(jì)劃速挑,調(diào)用存儲(chǔ)引擎的API來(lái)執(zhí)行查詢谤牡。

  • 將結(jié)果返回給客戶端。

WX20210629-182454@2x.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末姥宝,一起剝皮案震驚了整個(gè)濱河市翅萤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌腊满,老刑警劉巖套么,帶你破解...
    沈念sama閱讀 212,542評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異碳蛋,居然都是意外死亡胚泌,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門肃弟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)玷室,“玉大人,你說(shuō)我怎么就攤上這事笤受∏铉停” “怎么了?”我有些...
    開封第一講書人閱讀 158,021評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵箩兽,是天一觀的道長(zhǎng)津肛。 經(jīng)常有香客問(wèn)我,道長(zhǎng)汗贫,這世上最難降的妖魔是什么快耿? 我笑而不...
    開封第一講書人閱讀 56,682評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮芳绩,結(jié)果婚禮上掀亥,老公的妹妹穿的比我還像新娘。我一直安慰自己妥色,他們只是感情好搪花,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,792評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著嘹害,像睡著了一般撮竿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上笔呀,一...
    開封第一講書人閱讀 49,985評(píng)論 1 291
  • 那天幢踏,我揣著相機(jī)與錄音,去河邊找鬼许师。 笑死房蝉,一個(gè)胖子當(dāng)著我的面吹牛僚匆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播搭幻,決...
    沈念sama閱讀 39,107評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼咧擂,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了檀蹋?” 一聲冷哼從身側(cè)響起松申,我...
    開封第一講書人閱讀 37,845評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎俯逾,沒(méi)想到半個(gè)月后贸桶,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,299評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡桌肴,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,612評(píng)論 2 327
  • 正文 我和宋清朗相戀三年皇筛,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片识脆。...
    茶點(diǎn)故事閱讀 38,747評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖善已,靈堂內(nèi)的尸體忽然破棺而出灼捂,到底是詐尸還是另有隱情换团,我是刑警寧澤,帶...
    沈念sama閱讀 34,441評(píng)論 4 333
  • 正文 年R本政府宣布艘包,位于F島的核電站,受9級(jí)特大地震影響想虎,放射性物質(zhì)發(fā)生泄漏卦尊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,072評(píng)論 3 317
  • 文/蒙蒙 一舌厨、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧裙椭,春花似錦、人聲如沸揉燃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)炊汤。三九已至正驻,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間拨拓,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工婿着, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留醋界,地道東北人竟宋。 一個(gè)月前我還...
    沈念sama閱讀 46,545評(píng)論 2 362
  • 正文 我出身青樓形纺,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親逐样。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,658評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容

  • MySQL基礎(chǔ)架構(gòu)示意圖 客戶端 服務(wù)層連接器:管理連接挪捕,權(quán)限驗(yàn)證等查詢緩存:命中緩存則直接返回結(jié)果分析器:語(yǔ)法分...
    傳達(dá)室馬大爺閱讀 401評(píng)論 0 0
  • 我們經(jīng)常說(shuō)奏纪,看一個(gè)事兒千萬(wàn)不要直接陷入細(xì)節(jié)里,你應(yīng)該先鳥瞰其全貌序调,這樣能夠幫助你從高維度理解問(wèn)題兔簇。同樣炕置,對(duì)于 My...
    LibraSunny_閱讀 190評(píng)論 0 1
  • MySql的基礎(chǔ)架構(gòu)分成兩大部分(如圖): Server層 : 連接器 朴摊、查詢緩存、解析器此虑、優(yōu)化器、執(zhí)行器數(shù)據(jù)...
    52HzBoo閱讀 172評(píng)論 0 0
  • MySQL的基本架構(gòu)示意圖 從圖中可以知道介杆,MySQL可以分為兩部分:server層和存儲(chǔ)引擎層。并且不同...
    頹靡浪蕩君閱讀 770評(píng)論 0 1
  • 這道題應(yīng)該從 MySQL 架構(gòu)來(lái)理解荆隘,我們可以把 MySQL 拆解成幾個(gè)零件,如下圖所示 大致上來(lái)說(shuō)椰拒,MySQL ...
    JusticeCAO閱讀 135評(píng)論 0 0