1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        9張圖深入揭秘MySQL內(nèi)部架構(gòu)。。。

        共 2544字,需瀏覽 6分鐘

         ·

        2021-09-13 23:52

        本文讀完需10分鐘,速讀僅需6分鐘。

        前言

        目前大部分的后端開(kāi)發(fā)人員對(duì)MySQL的理解可能停留在一個(gè)黑盒子階段。

        對(duì)MySQL基本使用沒(méi)什么問(wèn)題,比如建庫(kù)、建表、建索引,執(zhí)行各種增刪改查。

        所有很多后端開(kāi)發(fā)人員眼中的MySQL如下圖所示

        導(dǎo)致在實(shí)際工作中碰到MySQL中死鎖異常、SQL性能太差、異常報(bào)錯(cuò)等問(wèn)題時(shí),直接百度搜索。

        然后跟著博客搗鼓就解決了,可能自己都沒(méi)搞明白里面的原理。

        為了解決這種知其然而不知其所以然的問(wèn)題,阿星的重學(xué)MySQL系列會(huì)帶著大家去探索MySQL底層原理的方方面面。

        這樣大家碰到MySQL的一些異?;蛘邌?wèn)題時(shí),能夠直戳本質(zhì),快速地定位解決。

        連接管理

        系統(tǒng)(客戶端)訪問(wèn)MySQL服務(wù)器前,做的第一件事就是建立TCP連接。

        經(jīng)過(guò)三次握手建立連接成功后,MySQL服務(wù)器對(duì)TCP傳輸過(guò)來(lái)的賬號(hào)密碼做身份認(rèn)證、權(quán)限獲取。

        • 用戶名或密碼不對(duì),會(huì)收到一個(gè)Access denied for user錯(cuò)誤,客戶端程序結(jié)束執(zhí)行
        • 用戶名密碼認(rèn)證通過(guò),會(huì)從權(quán)限表查出賬號(hào)擁有的權(quán)限與連接關(guān)聯(lián),之后的權(quán)限判斷邏輯,都將依賴于此時(shí)讀到的權(quán)限

        接著我們來(lái)思考一個(gè)問(wèn)題

        一個(gè)系統(tǒng)只會(huì)和MySQL服務(wù)器建立一個(gè)連接嗎?

        只能有一個(gè)系統(tǒng)和MySQL服務(wù)器建立連接嗎?

        當(dāng)然不是,多個(gè)系統(tǒng)都可以和MySQL服務(wù)器建立連接,每個(gè)系統(tǒng)建立的連接肯定不止一個(gè)。

        所以,為了解決TCP無(wú)限創(chuàng)建與TCP頻繁創(chuàng)建銷毀帶來(lái)的資源耗盡、性能下降問(wèn)題。

        MySQL服務(wù)器里有專門的TCP連接池限制接數(shù),采用長(zhǎng)連接模式復(fù)用TCP連接,來(lái)解決上述問(wèn)題。

        TCP連接收到請(qǐng)求后,必須要分配給一個(gè)線程去執(zhí)行,所以還會(huì)有個(gè)線程池,去走后面的流程。

        這些內(nèi)容我們都?xì)w納到MySQL連接管理組件中。

        所以連接管理的職責(zé)是負(fù)責(zé)認(rèn)證、管理連接、獲取權(quán)限信息。

        解析與優(yōu)化

        經(jīng)過(guò)了連接管理,現(xiàn)在MySQL服務(wù)器已經(jīng)獲取到SQL字符串。

        如果是查詢語(yǔ)句,MySQL服務(wù)器會(huì)使用select SQL字符串作為key。

        去緩存中獲取,命中緩存,直接返回結(jié)果(返回前需要做權(quán)限驗(yàn)證),未命中執(zhí)行后面的階段,這個(gè)步驟叫查詢緩存

        需要注意,select SQL字符串要完全匹配,有任何不同的地方都會(huì)導(dǎo)致緩存不被命中(空格、注釋、大小寫(xiě)、某些系統(tǒng)函數(shù))。

        小貼士:雖然查詢緩存有時(shí)可以提升系統(tǒng)性能,但也不得不因維護(hù)這塊緩存而造成一些開(kāi)銷,從MySQL 5.7.20開(kāi)始,不推薦使用查詢緩存,并在MySQL 8.0中刪除。

        沒(méi)有命中緩存,或者非select SQL就來(lái)到分析器階段了。

        因?yàn)橄到y(tǒng)發(fā)送過(guò)來(lái)的只是一段文本字符串,所以MySQL服務(wù)器要按照SQL語(yǔ)法對(duì)這段文本進(jìn)行解析。

        如果你的SQL字符串不符合語(yǔ)法規(guī)范,就會(huì)收到You have an error in your SQL syntax錯(cuò)誤提醒

        通過(guò)了分析器,說(shuō)明SQL字符串符合語(yǔ)法規(guī)范,現(xiàn)在MySQL服務(wù)器要執(zhí)行SQL語(yǔ)句了。

        MySQL服務(wù)器要怎么執(zhí)行呢?

        你需要產(chǎn)出執(zhí)行計(jì)劃,交給MySQL服務(wù)器執(zhí)行,所以來(lái)到了優(yōu)化器階段。

        優(yōu)化器不僅僅只是生成執(zhí)行計(jì)劃這么簡(jiǎn)單,這個(gè)過(guò)程它會(huì)幫你優(yōu)化SQL語(yǔ)句。

        外連接轉(zhuǎn)換為內(nèi)連接、表達(dá)式簡(jiǎn)化、子查詢轉(zhuǎn)為連接、連接順序、索引選擇等一堆東西,優(yōu)化的結(jié)果就是執(zhí)行計(jì)劃。

        截止到現(xiàn)在,還沒(méi)有真正去讀寫(xiě)真實(shí)的表,僅僅只是產(chǎn)出了一個(gè)執(zhí)行計(jì)劃。

        于是就進(jìn)入了執(zhí)行器階段,MySQL服務(wù)器終于要執(zhí)行SQL語(yǔ)句了。

        開(kāi)始執(zhí)行的時(shí)候,要先判斷一下對(duì)這個(gè)表有沒(méi)有相應(yīng)的權(quán)限,如果沒(méi)有,就會(huì)返回權(quán)限錯(cuò)誤。

        如果有權(quán)限,根據(jù)執(zhí)行計(jì)劃調(diào)用存儲(chǔ)引擎API對(duì)表進(jìn)行的讀寫(xiě)。

        存儲(chǔ)引擎API只是抽象接口,下面還有個(gè)存儲(chǔ)引擎層,具體實(shí)現(xiàn)還是要看表選擇的存儲(chǔ)引擎。

        講到這里,上面提到的查詢緩存、分析器、優(yōu)化器、執(zhí)行器都可以歸納到MySQL解析與優(yōu)化組件中。

        所以解析與優(yōu)化的職責(zé)如下:

        • 緩存
        • SQL語(yǔ)法解析驗(yàn)證
        • SQL優(yōu)化并生成執(zhí)行計(jì)劃
        • 根據(jù)執(zhí)行計(jì)劃調(diào)用存儲(chǔ)引擎接口

        其中連接管理解析與優(yōu)化處于MySQL架構(gòu)中的Server層。

        小結(jié)

        在學(xué)習(xí)任何知識(shí)前,先不要著急的陷入細(xì)節(jié),而是先了解大致脈絡(luò),有個(gè)全局觀,之后再去深入相關(guān)的細(xì)節(jié)。

        MySql架構(gòu)分為Servce層與存儲(chǔ)引擎層。

        連接管理、解析與優(yōu)化這些并不涉及讀寫(xiě)表數(shù)據(jù)的組件劃分到Servce層,讀寫(xiě)表數(shù)據(jù)而是交給存儲(chǔ)引擎層來(lái)做。

        通過(guò)這種架構(gòu)設(shè)計(jì),我們發(fā)現(xiàn)Servce層其實(shí)就是公用層,存儲(chǔ)引擎層就是多態(tài)層,按需選擇具體的存儲(chǔ)引擎。

        再細(xì)想下,它和模板方法設(shè)計(jì)模式一摸一樣,它們的執(zhí)行流程是固定的,Servce層等于公用模板函數(shù),存儲(chǔ)引擎層等于抽象模板函數(shù),按需子類實(shí)現(xiàn)。

        阿星最后以一張MySQL簡(jiǎn)化版的架構(gòu)圖結(jié)束本文,我們下期再見(jiàn)~

        站在巨人的肩膀上:

        • 《MySQL實(shí)戰(zhàn)45講》
        • 《從零開(kāi)始帶你成為MySQL實(shí)戰(zhàn)優(yōu)化高手》
        • 《MySQL是怎樣運(yùn)行的:從根兒上理解MySQL》
        • 《MySQL技術(shù)Innodb存儲(chǔ)引擎》

        Java并發(fā)編程好文推薦

        關(guān)于我

        阿星是一個(gè)熱愛(ài)技術(shù)的Java程序猿,公眾號(hào)  「程序猿阿星」 定期分享有趣有料的精品原創(chuàng)文章!

        非常感謝各位小哥哥小姐姐們能看到這里,原創(chuàng)不易,文章有幫助可以關(guān)注、點(diǎn)個(gè)贊、分享與評(píng)論,都是支持(莫要白嫖)!

        愿你我都能奔赴在各自想去的路上,我們下篇文章見(jiàn)。



        - END -


        瀏覽 35
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            狠狠躁日日躁夜夜躁av | 久久AV资源站 | 国产大片黄 | 国产福利不卡在线 | 白丝校花被狂揉大胸 | 久久久黄色片 | 粉嫩99精品99久久久久久特污兔 | 风骚少妇图片 | 亚洲欧美v在线视频 | 操骚逼综合网 |