重學MySQL-揭開面紗,顯露架構

ITPUB社群發表於2022-11-30


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

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

所有很多後端開發人員眼中的MySQL如下圖所示

重學MySQL-揭開面紗,顯露架構

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

然後跟著部落格搗鼓就解決了,可能自己都沒搞明白裡面的原理。

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

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

連線管理

系統(客戶端)訪問MySQL伺服器前,做的第一件事就是建立TCP連線。

經過三次握手建立連線成功後,MySQL伺服器對TCP傳輸過來的賬號密碼做身份認證、許可權獲取。

  • 使用者名稱或密碼不對,會收到一個Access denied for user錯誤,客戶端程式結束執行
  • 使用者名稱密碼認證透過,會從許可權表查出賬號擁有的許可權與連線關聯,之後的許可權判斷邏輯,都將依賴於此時讀到的許可權

接著我們來思考一個問題

一個系統只會和MySQL伺服器建立一個連線嗎?

只能有一個系統和MySQL伺服器建立連線嗎?

當然不是,多個系統都可以和MySQL伺服器建立連線,每個系統建立的連線肯定不止一個。

所以,為了解決TCP無限建立與TCP頻繁建立銷燬帶來的資源耗盡、效能下降問題。

MySQL伺服器裡有專門的TCP連線池限制接數,採用長連線模式複用TCP連線,來解決上述問題。

重學MySQL-揭開面紗,顯露架構

TCP連線收到請求後,必須要分配給一個執行緒去執行,所以還會有個執行緒池,去走後面的流程。

這些內容我們都歸納到MySQL連線管理元件中。

所以連線管理的職責是負責認證、管理連線、獲取許可權資訊。

解析與最佳化

經過了連線管理,現在MySQL伺服器已經獲取到SQL字串。

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

去快取中獲取,命中快取,直接返回結果(返回前需要做許可權驗證),未命中執行後面的階段,這個步驟叫查詢快取

重學MySQL-揭開面紗,顯露架構

需要注意,select SQL字串要完全匹配,有任何不同的地方都會導致快取不被命中(空格、註釋、大小寫、某些系統函式)。

小貼士:雖然查詢快取有時可以提升系統效能,但也不得不因維護這塊快取而造成一些開銷,從MySQL 5.7.20開始,不推薦使用查詢快取,並在MySQL 8.0中刪除。

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

因為系統傳送過來的只是一段文字字串,所以MySQL伺服器要按照SQL語法對這段文字進行解析。

重學MySQL-揭開面紗,顯露架構

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

透過了分析器,說明SQL字串符合語法規範,現在MySQL伺服器要執行SQL語句了。

MySQL伺服器要怎麼執行呢?

你需要產出執行計劃,交給MySQL伺服器執行,所以來到了最佳化器階段。

重學MySQL-揭開面紗,顯露架構

最佳化器不僅僅只是生成執行計劃這麼簡單,這個過程它會幫你最佳化SQL語句。

外連線轉換為內連線、表示式簡化、子查詢轉為連線、連線順序、索引選擇等一堆東西,最佳化的結果就是執行計劃。

截止到現在,還沒有真正去讀寫真實的表,僅僅只是產出了一個執行計劃。

於是就進入了執行器階段,MySQL伺服器終於要執行SQL語句了。

重學MySQL-揭開面紗,顯露架構

開始執行的時候,要先判斷一下對這個表有沒有相應的許可權,如果沒有,就會返回許可權錯誤。

如果有許可權,根據執行計劃呼叫儲存引擎API對錶進行的讀寫。

重學MySQL-揭開面紗,顯露架構

儲存引擎API只是抽象介面,下面還有個儲存引擎層,具體實現還是要看錶選擇的儲存引擎。

講到這裡,上面提到的查詢快取、分析器、最佳化器、執行器都可以歸納到MySQL解析與最佳化元件中。

所以解析與最佳化的職責如下:

  • 快取
  • SQL語法解析驗證
  • SQL最佳化並生成執行計劃
  • 根據執行計劃呼叫儲存引擎介面
重學MySQL-揭開面紗,顯露架構

其中連線管理解析與最佳化處於MySQL架構中的Server層。

小結

在學習任何知識前,先不要著急的陷入細節,而是先了解大致脈絡,有個全域性觀,之後再去深入相關的細節。

MySql架構分為Servce層與儲存引擎層。

連線管理、解析與最佳化這些並不涉及讀寫表資料的元件劃分到Servce層,讀寫表資料而是交給儲存引擎層來做。

透過這種架構設計,我們發現Servce層其實就是公用層,儲存引擎層就是多型層,按需選擇具體的儲存引擎。

再細想下,它和模板方法設計模式一摸一樣,它們的執行流程是固定的,Servce層等於公用模板函式,儲存引擎層等於抽象模板函式,按需子類實現。

阿星最後以一張MySQL簡化版的架構圖結束本文,我們下期再見~

重學MySQL-揭開面紗,顯露架構

站在巨人的肩膀上:

  • 《MySQL實戰45講》
  • 《從零開始帶你成為MySQL實戰最佳化高手》
  • 《MySQL是怎樣執行的:從根兒上理解MySQL》
  • 《MySQL技術Innodb儲存引擎》

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70024420/viewspace-2925890/,如需轉載,請註明出處,否則將追究法律責任。

相關文章