<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          共 2544字,需瀏覽 6分鐘

           ·

          2021-09-13 23:52

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

          前言

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

          MySQL基本使用沒什么問題,比如建庫、建表、建索引,執(zhí)行各種增刪改查。

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

          導致在實際工作中碰到MySQL中死鎖異常、SQL性能太差、異常報錯等問題時,直接百度搜索。

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

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

          這樣大家碰到MySQL的一些異常或者問題時,能夠直戳本質(zhì),快速地定位解決。

          連接管理

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

          經(jīng)過三次握手建立連接成功后,MySQL服務器對TCP傳輸過來的賬號密碼做身份認證、權(quán)限獲取。

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

          接著我們來思考一個問題

          一個系統(tǒng)只會和MySQL服務器建立一個連接嗎?

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

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

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

          MySQL服務器里有專門的TCP連接池限制接數(shù),采用長連接模式復用TCP連接,來解決上述問題。

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

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

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

          解析與優(yōu)化

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

          如果是查詢語句,MySQL服務器會使用select SQL字符串作為key

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

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

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

          沒有命中緩存,或者非select SQL就來到分析器階段了。

          因為系統(tǒng)發(fā)送過來的只是一段文本字符串,所以MySQL服務器要按照SQL語法對這段文本進行解析。

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

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

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

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

          優(yōu)化器不僅僅只是生成執(zhí)行計劃這么簡單,這個過程它會幫你優(yōu)化SQL語句。

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

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

          于是就進入了執(zhí)行器階段,MySQL服務器終于要執(zhí)行SQL語句了。

          開始執(zhí)行的時候,要先判斷一下對這個表有沒有相應的權(quán)限,如果沒有,就會返回權(quán)限錯誤。

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

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

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

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

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

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

          小結(jié)

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

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

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

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

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

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

          站在巨人的肩膀上:

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

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

          關(guān)于我

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

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

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



          - END -


          瀏覽 35
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  北条麻妃国产九九九 | 国产精品国产三级在线专区 | 翔田千里无码一区二区三区 | 欧日韩另类黄色 | 19日韩福利视频 |