MySQL 邏輯架構(gòu)介紹

一、mysql 的分層邏輯架構(gòu)

1.和其它數(shù)據(jù)庫相比扶歪,MySQL有點與眾不同理肺,它的架構(gòu)可以在多種不同場景中應(yīng)用并發(fā)揮良好作用。主要體現(xiàn)在存儲引擎的架構(gòu)上善镰。
2.插件式的存儲引擎架構(gòu)將查詢處理和其它的系統(tǒng)任務(wù)以及數(shù)據(jù)的存儲提取相分離妹萨。這種架構(gòu)可以根據(jù)業(yè)務(wù)的需求和實際需要選擇合適的存儲引擎。


組織架構(gòu)圖

mysql 四層架構(gòu)

1.連接層:最上層是一些客戶端和連接服務(wù)炫欺,包含本地sock通信和大多數(shù)基于客戶端/服務(wù)端工具實現(xiàn)的類似于tcp/ip的通信乎完。主要完成一些類似于連接處理、授權(quán)認(rèn)證品洛、及相關(guān)的安全方案树姨。在該層上引入了線程池的概念,為通過認(rèn)證安全接入的客戶端提供線程桥状。同樣在該層上可以實現(xiàn)基于SSL的安全鏈接帽揪。服務(wù)器也會為安全接入的每個客戶端驗證它所具有的操作權(quán)限。
2.服務(wù)層:第二層架構(gòu)主要完成大多數(shù)的核心服務(wù)功能辅斟,如SQL接口台丛,并完成緩存的查詢,SQL的分析和優(yōu)化及部分內(nèi)置函數(shù)的執(zhí)行。所有跨存儲引擎的功能也在這一層實現(xiàn)挽霉,如過程防嗡、函數(shù)等。在該層侠坎,服務(wù)器會解析查詢并創(chuàng)建相應(yīng)的內(nèi)部解析樹蚁趁,并對其完成相應(yīng)的優(yōu)化如確定查詢表的順序,是否利用索引等实胸,最后生成相應(yīng)的執(zhí)行操作他嫡。如果是select語句,服務(wù)器還會查詢內(nèi)部的緩存庐完。如果緩存空間足夠大钢属,這樣在解決大量讀操作的環(huán)境中能夠很好的提升系統(tǒng)的性能。

Management Serveices & Utilities 系統(tǒng)管理和控制工具
SQL Interface SQL 接口门躯。 接受用戶的 SQL 命令淆党, 并且返回用戶需要查詢的結(jié)果。 比如 select from 就是調(diào)用 SQL Interface
Parser 解析器讶凉。 SQL 命令傳遞到解析器的時候會被解析器驗證和解析
Optimizer 查詢優(yōu)化器染乌。 SQL 語句在查詢之前會使用查詢優(yōu)化器對查詢進(jìn)行優(yōu)化, 比如有 where 條件時懂讯, 優(yōu)化器來決定先投影還是先過濾荷憋。
Cache 和 Buffer 查詢緩存。 如果查詢緩存有命中的查詢結(jié)果褐望, 查詢語句就可以直接去查詢緩存中取 數(shù)據(jù)勒庄。 這個緩存機制是由一系列小緩存組成的。 比如表緩存瘫里, 記錄緩存实蔽, key 緩存, 權(quán)限緩存等

3.引擎層:存儲引擎層减宣,存儲引擎真正的負(fù)責(zé)了MySQL中數(shù)據(jù)的存儲和提取盐须,服務(wù)器通過APl與存儲引擎進(jìn)行通信玩荠。不同的存儲引擎具有的功能不同漆腌,這樣我們可以根據(jù)自己的實際需要進(jìn)行選取。后面介紹MyISAM和InnoDB
4.存儲層:數(shù)據(jù)存儲層阶冈,主要是將數(shù)據(jù)存儲在運行于裸設(shè)備的文件系統(tǒng)之上闷尿,并完成與存儲引擎的交互。

二女坑、MySQL 部件

Connectors

指的不同語言中與SQL的交互

Management Serveices & Utilities

系統(tǒng)管理和控制工具

Connection Pool:連接池

管理緩沖用戶連接填具,線程處理等需要緩存的需求。負(fù)責(zé)監(jiān)聽對 MySQL Server 的各種請求,接收連接請求劳景,轉(zhuǎn)發(fā)所有連接請求到線程管理模塊誉简。
每一個連接上 MySQL Server 的客戶端請求都會被分配(或創(chuàng)建)一個連接線程為其單獨服務(wù)。而連接線程的主要工作就是負(fù)責(zé) MySQL Server 與客戶端的通信盟广。接受客戶端的命令請求闷串,傳遞 Server 端的結(jié)果信息等。線程管理模塊則負(fù)責(zé)管理維護(hù)這些連接線程筋量。包括線程的創(chuàng)建烹吵,線程的 cache 等。

SQL Interface:SQL接口

接受用戶的SQL命令桨武,并且返回用戶需要查詢的結(jié)果肋拔。比如select from就是調(diào)用SQL Interface

Parser:解析器

SQL命令傳遞到解析器的時候會被解析器驗證和解析。解析器是由Lex和YACC實現(xiàn)的呀酸,是一個很長的腳本凉蜂。
在 MySQL中我們習(xí)慣將所有 Client 端發(fā)送給 Server 端的命令都稱為 Query,在 MySQL Server 里面七咧,連接線程接收到客戶端的一個 Query 后跃惫,會直接將該 Query 傳遞給專門負(fù)責(zé)將各種 Query 進(jìn)行分類然后轉(zhuǎn)發(fā)給各個對應(yīng)的處理模塊。

解析器的主要功能:

將SQL語句進(jìn)行語義和語法的分析艾栋,分解成數(shù)據(jù)結(jié)構(gòu)爆存,然后按照不同的操作類型進(jìn)行分類,然后做出針對性的轉(zhuǎn)發(fā)到后續(xù)步驟蝗砾,以后SQL語句的傳遞和處理就是基于這個結(jié)構(gòu)的先较。
如果在分解構(gòu)成中遇到錯誤,那么就說明這個sql語句是不合理的

Optimizer:查詢優(yōu)化器

SQL語句在查詢之前會使用查詢優(yōu)化器對查詢進(jìn)行優(yōu)化悼粮。就是優(yōu)化客戶端發(fā)送過來的 sql 語句 闲勺,根據(jù)客戶端請求的 query 語句,和數(shù)據(jù)庫中的一些統(tǒng)計信息扣猫,在一系列算法的基礎(chǔ)上進(jìn)行分析菜循,得出一個最優(yōu)的策略,告訴后面的程序如何取得這個 query 語句的結(jié)果
他使用的是“選取-投影-聯(lián)接”策略進(jìn)行查詢申尤。
用一個例子就可以理解: select uid,name from user where gender = 1;
這個select 查詢先根據(jù)where 語句進(jìn)行選取癌幕,而不是先將表全部查詢出來以后再進(jìn)行g(shù)ender過濾,這個select查詢先根據(jù)uid和name進(jìn)行屬性投影昧穿,而不是將屬性全部取出以后勺远,再進(jìn)行過濾將這兩個查詢條件聯(lián)接起來生成最終查詢結(jié)果

Cache和Buffer:查詢緩存

他的主要功能是將客戶端提交給MySQL 的 Select 類 query 請求的返回結(jié)果集 cache 到內(nèi)存中,與該 query 的一個 hash 值 做一個對應(yīng)时鸵。該 Query 所取數(shù)據(jù)的基表發(fā)生任何數(shù)據(jù)的變化之后胶逢, MySQL 會自動使該 query 的Cache 失效。在讀寫比例非常高的應(yīng)用系統(tǒng)中, Query Cache 對性能的提高是非常顯著的初坠。當(dāng)然它對內(nèi)存的消耗也是非常大的和簸。
如果查詢緩存有命中的查詢結(jié)果,查詢語句就可以直接去查詢緩存中取數(shù)據(jù)碟刺。這個緩存機制是由一系列小緩存組成的比搭。比如表緩存,記錄緩存南誊,key緩存身诺,權(quán)限緩存等

buffer與cache的區(qū)別?

緩存那里實際上有buffer和cache兩個抄囚,那它們之間是否有什么不同呢霉赡?簡單的說就是,buffer是寫緩存幔托,cache是讀緩存穴亏。

存儲引擎接口

存儲引擎接口模塊可以說是 MySQL 數(shù)據(jù)庫中最有特色的一點了。目前各種數(shù)據(jù)庫產(chǎn)品中重挑,基本上只有 MySQL 可以實現(xiàn)其底層數(shù)據(jù)存儲引擎的插件式管理嗓化。這個模塊實際上只是 一個抽象類,但正是因為它成功地將各種數(shù)據(jù)處理高度抽象化谬哀,才成就了今天 MySQL 可插拔存儲引擎的特色刺覆。
從上圖還可以看出,MySQL區(qū)別于其他數(shù)據(jù)庫的最重要的特點就是其插件式的表存儲引擎史煎。MySQL插件式的存儲引擎架構(gòu)提供了一系列標(biāo)準(zhǔn)的管理和服務(wù)支持谦屑,這些標(biāo)準(zhǔn)與存儲引擎本身無關(guān),可能是每個數(shù)據(jù)庫系統(tǒng)本身都必需的篇梭,如SQL分析器和優(yōu)化器等氢橙,而存儲引擎是底層物理結(jié)構(gòu)的實現(xiàn),每個存儲引擎開發(fā)者都可以按照自己的意愿來進(jìn)行開發(fā)恬偷。
注意:存儲引擎是基于表的悍手,而不是數(shù)據(jù)庫。

三袍患、SQL SELECT語句執(zhí)行過程

執(zhí)行過程
MySQL 整個查詢執(zhí)行過程坦康,總的來說分為 6 個步驟 :

SQL執(zhí)行步驟:請求、緩存协怒、SQL解析涝焙、優(yōu)化SQL查詢卑笨、調(diào)用引擎執(zhí)行孕暇,返回結(jié)果
1、連接:客戶端向 MySQL 服務(wù)器發(fā)送一條查詢請求,與connectors交互:連接池認(rèn)證相關(guān)處理妖滔。
2隧哮、緩存:服務(wù)器首先檢查查詢緩存,如果命中緩存座舍,則立刻返回存儲在緩存中的結(jié)果沮翔,否則進(jìn)入下一階段
3、解析:服務(wù)器進(jìn)行SQL解析(詞法語法)曲秉、預(yù)處理采蚀。
4、優(yōu)化:再由優(yōu)化器生成對應(yīng)的執(zhí)行計劃承二。
5榆鼠、執(zhí)行:MySQL 根據(jù)執(zhí)行計劃,調(diào)用存儲引擎的 API來執(zhí)行查詢亥鸠。
6妆够、結(jié)果:將結(jié)果返回給客戶端,同時緩存查詢結(jié)果负蚊。

mysql 的查詢流程大致是:

1.首先mysql 客戶端通過協(xié)議與 mysql 服務(wù)器建連接神妹, 發(fā)送查詢語句, 先檢查查詢緩存家妆, 如果命中鸵荠, 直接返回結(jié)果,否則進(jìn)行語句解析,也就是說伤极, 在解析查詢之前腰鬼, 服務(wù)器會先訪問查詢緩存(query cache)——它存儲 SELECT 語句以及相應(yīng)的查詢結(jié)果集。 如果某個查詢結(jié)果已經(jīng)位于緩存中塑荒, 服務(wù)器就不會再對查詢進(jìn)行解析熄赡、 優(yōu)化、 以及執(zhí)行齿税。 它僅僅將緩存中的結(jié)果返回給用戶即可彼硫, 這將大大提高系統(tǒng)的性能。
2.語法解析器和預(yù)處理: 首先 mysql 通過關(guān)鍵字將 SQL 語句進(jìn)行解析凌箕, 并生成一顆對應(yīng)的“解析樹”拧篮。 mysql 解析器將使用 mysql 語法規(guī)則驗證和解析查詢; 預(yù)處理器則根據(jù)一些 mysql 規(guī)則進(jìn)一步檢查解析數(shù)是否合法牵舱。
3.查詢優(yōu)化器當(dāng)解析樹被認(rèn)為是合法的了串绩, 并且由優(yōu)化器將其轉(zhuǎn)化成執(zhí)行計劃。 一條查詢可以有很多種執(zhí)行方式芜壁,最后都返回相同的結(jié)果礁凡。 優(yōu)化器的作用就是找到這其中最好的執(zhí)行計劃高氮。

SQL 語句的執(zhí)行順序
SQL 語句的執(zhí)行順序

四、MySQL 存儲引擎

查看 mysql 存儲引擎
  • 查看 mysql 支持的存儲引擎
    show engines;


    查看 mysql 支持的存儲引擎
  • 查看 mysql 默認(rèn)的存儲引擎
    show variables like '%storage_engine%';


    查看 mysql 默認(rèn)的存儲引擎
MyISAM 引擎和 InnoDb 引擎的對比
MyISAM 引擎和 InnoDb 引擎的對比

innodb引擎的相關(guān)拓展

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末顷牌,一起剝皮案震驚了整個濱河市剪芍,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌窟蓝,老刑警劉巖罪裹,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異运挫,居然都是意外死亡状共,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進(jìn)店門谁帕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來口芍,“玉大人,你說我怎么就攤上這事雇卷△尥郑” “怎么了?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵关划,是天一觀的道長小染。 經(jīng)常有香客問我,道長贮折,這世上最難降的妖魔是什么裤翩? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮调榄,結(jié)果婚禮上踊赠,老公的妹妹穿的比我還像新娘。我一直安慰自己每庆,他們只是感情好筐带,可當(dāng)我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著缤灵,像睡著了一般伦籍。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上腮出,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天帖鸦,我揣著相機與錄音,去河邊找鬼胚嘲。 笑死作儿,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的馋劈。 我是一名探鬼主播攻锰,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼晾嘶,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了口注?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤君珠,失蹤者是張志新(化名)和其女友劉穎寝志,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體策添,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡材部,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了唯竹。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片乐导。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖浸颓,靈堂內(nèi)的尸體忽然破棺而出物臂,到底是詐尸還是另有隱情,我是刑警寧澤产上,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布棵磷,位于F島的核電站,受9級特大地震影響晋涣,放射性物質(zhì)發(fā)生泄漏仪媒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一谢鹊、第九天 我趴在偏房一處隱蔽的房頂上張望算吩。 院中可真熱鬧,春花似錦佃扼、人聲如沸偎巢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽艘狭。三九已至,卻和暖如春翠订,著一層夾襖步出監(jiān)牢的瞬間巢音,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工尽超, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留官撼,地道東北人。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓似谁,卻偏偏與公主長得像傲绣,于是被迫代替她去往敵國和親掠哥。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,465評論 2 348