重學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
連線,來解決上述問題。
TCP
連線收到請求後,必須要分配給一個執行緒去執行,所以還會有個執行緒池,去走後面的流程。
這些內容我們都歸納到MySQL
的連線管理元件中。
所以連線管理的職責是負責認證、管理連線、獲取許可權資訊。
解析與最佳化
經過了連線管理,現在MySQL
伺服器已經獲取到SQL
字串。
如果是查詢語句,MySQL
伺服器會使用select SQL
字串作為key
。
去快取中獲取,命中快取,直接返回結果(返回前需要做許可權驗證),未命中執行後面的階段,這個步驟叫查詢快取。
需要注意,select SQL
字串要完全匹配,有任何不同的地方都會導致快取不被命中(空格、註釋、大小寫、某些系統函式)。
小貼士:雖然查詢快取有時可以提升系統效能,但也不得不因維護這塊快取而造成一些開銷,從MySQL 5.7.20開始,不推薦使用查詢快取,並在MySQL 8.0中刪除。
沒有命中快取,或者非select SQL
就來到分析器階段了。
因為系統傳送過來的只是一段文字字串,所以MySQL
伺服器要按照SQL
語法對這段文字進行解析。
如果你的SQL
字串不符合語法規範,就會收到You have an error in your SQL syntax
錯誤提醒
透過了分析器,說明SQL
字串符合語法規範,現在MySQL
伺服器要執行SQL
語句了。
MySQL
伺服器要怎麼執行呢?
你需要產出執行計劃,交給MySQL
伺服器執行,所以來到了最佳化器階段。
最佳化器不僅僅只是生成執行計劃這麼簡單,這個過程它會幫你最佳化SQL
語句。
如外連線轉換為內連線、表示式簡化、子查詢轉為連線、連線順序、索引選擇等一堆東西,最佳化的結果就是執行計劃。
截止到現在,還沒有真正去讀寫真實的表,僅僅只是產出了一個執行計劃。
於是就進入了執行器階段,MySQL
伺服器終於要執行SQL
語句了。
開始執行的時候,要先判斷一下對這個表有沒有相應的許可權,如果沒有,就會返回許可權錯誤。
如果有許可權,根據執行計劃呼叫儲存引擎API
對錶進行的讀寫。
儲存引擎API
只是抽象介面,下面還有個儲存引擎層,具體實現還是要看錶選擇的儲存引擎。
講到這裡,上面提到的查詢快取、分析器、最佳化器、執行器都可以歸納到MySQL
的解析與最佳化元件中。
所以解析與最佳化的職責如下:
快取 SQL語法解析驗證 SQL最佳化並生成執行計劃 根據執行計劃呼叫儲存引擎介面
其中連線管理與解析與最佳化處於MySQL
架構中的Server
層。
小結
在學習任何知識前,先不要著急的陷入細節,而是先了解大致脈絡,有個全域性觀,之後再去深入相關的細節。
MySql
架構分為Servce
層與儲存引擎層。
連線管理、解析與最佳化這些並不涉及讀寫表資料的元件劃分到Servce
層,讀寫表資料而是交給儲存引擎層來做。
透過這種架構設計,我們發現Servce
層其實就是公用層,儲存引擎層就是多型層,按需選擇具體的儲存引擎。
再細想下,它和模板方法設計模式一摸一樣,它們的執行流程是固定的,Servce
層等於公用模板函式,儲存引擎層等於抽象模板函式,按需子類實現。
阿星最後以一張MySQL
簡化版的架構圖結束本文,我們下期再見~
站在巨人的肩膀上:
《MySQL實戰45講》 《從零開始帶你成為MySQL實戰最佳化高手》 《MySQL是怎樣執行的:從根兒上理解MySQL》 《MySQL技術Innodb儲存引擎》
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70024420/viewspace-2925890/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 是時候揭開混合雲架構的神祕面紗了!架構
- 揭開ThreadLocal的面紗thread
- 圖文並茂|為你揭開微服務架構的“神祕面紗”!微服務架構
- 『MySQL』揭開索引神祕面紗MySql索引
- 揭開 Kubernetes 的神祕面紗
- 揭開“QUIC”的神祕面紗UI
- 揭開“信創”的神秘面紗
- 揭開OKR (Objectives and Key Results) 的面紗OKRObject
- 揭開Kotlin協程的神秘面紗Kotlin
- 揭開神秘面紗——深入淺出ThreadLocalthread
- 揭開 Hyperledger Cacti 專案的面紗
- 揭開AI、機器學習和深度學習的神秘面紗AI機器學習深度學習
- 揭開Java記憶體管理的面紗Java記憶體
- 揭開redux,react-redux的神祕面紗ReduxReact
- 揭開Future的神祕面紗——任務取消
- Dive into TensorFlow系列(3)- 揭開Tensor的神秘面紗
- 揭開Future的神祕面紗——結果獲取
- 揭開Future的神祕面紗——任務執行
- 鴻蒙OS揭面紗,開發者怎麼看鴻蒙
- 揭開java記憶體模型的神祕面紗Java記憶體模型
- 揭開單體應用程式的神祕面紗
- 從一個Demo開始,揭開Netty的神祕面紗Netty
- 從病毒到免疫, “科學地”揭開新冠病毒的神祕面紗
- 揭開React中server-side rending的神祕面紗ReactServerIDE
- 揭開JS無埋點技術的神祕面紗JS
- 揭開神秘面紗,會stream流就會大資料大資料
- 揭開NoahV智慧運維前端框架的神祕面紗運維前端框架
- 《SpringBoot判空處理》揭開@Valid與@Validated的面紗Spring Boot
- 揭開DRF序列化技術的神祕面紗
- 揭開Redux神祕面紗:手寫一個min-ReduxRedux
- 揭開C++移動與複製的神祕面紗C++
- netty原始碼分析之揭開reactor執行緒的面紗(三)Netty原始碼React執行緒
- netty原始碼分析之揭開reactor執行緒的面紗(二)Netty原始碼React執行緒
- netty原始碼分析之揭開reactor執行緒的面紗(一)Netty原始碼React執行緒
- 【譯】用 GitHub Copilot 提交註釋揭開歷史的神秘面紗Github
- 揭開雲原生資料管理的神祕面紗:操作層級
- NYDIG交易所揭開區塊鏈節點神秘的面紗區塊鏈
- 在Axon框架中揭開跟蹤事件處理器的神秘面紗框架事件