文章插圖

文章插圖
前言
目前大部分的后端開發人員對MySQL的理解可能停留在一個黑盒子階段 。
對MySQL基本使用沒什么問題,比如建庫、建表、建索引,執行各種增刪改查 。
所有很多后端開發人員眼中的MySQL如下圖所示
然后跟著博客搗鼓就解決了,可能自己都沒搞明白里面的原理 。
為了解決這種知其然而不知其所以然的問題,阿星的重學MySQL系列會帶著大家去探索MySQL底層原理的方方面面 。
這樣大家碰到MySQL的一些異常或者問題時,能夠直戳本質,快速地定位解決 。
連接管理
系統(客戶端)訪問MySQL服務器前,做的第一件事就是建立TCP連接 。
經過三次握手建立連接成功后,MySQL服務器對TCP傳輸過來的賬號密碼做身份認證、權限獲取 。
用戶名或密碼不對,會收到一個Access denied for user錯誤,客戶端程序結束執行用戶名密碼認證通過,會從權限表查出賬號擁有的權限與連接關聯,之后的權限判斷邏輯,都將依賴于此時讀到的權限
接著我們來思考一個問題
一個系統只會和MySQL服務器建立一個連接嗎?
只能有一個系統和MySQL服務器建立連接嗎?
當然不是,多個系統都可以和MySQL服務器建立連接,每個系統建立的連接肯定不止一個 。
所以,為了解決TCP無限創建與TCP頻繁創建銷毀帶來的資源耗盡、性能下降問題 。
MySQL服務器里有專門的TCP連接池限制接數,采用長連接模式復用TCP連接,來解決上述問題 。
這些內容我們都歸納到MySQL的連接管理組件中 。
所以連接管理的職責是負責認證、管理連接、獲取權限信息 。
【mysql認證有用嗎 mysql 認證證書有哪些】解析與優化
經過了連接管理,現在MySQL服務器已經獲取到SQL字符串 。
如果是查詢語句,MySQL服務器會使用select SQL字符串作為key 。
去緩存中獲取,命中緩存,直接返回結果(返回前需要做權限驗證),未命中執行后面的階段,這個步驟叫查詢緩存 。
小貼士:雖然查詢緩存有時可以提升系統性能,但也不得不因維護這塊緩存而造成一些開銷,從MySQL 5.7.20開始,不推薦使用查詢緩存,并在MySQL 8.0中刪除 。沒有命中緩存,或者非select SQL就來到分析器階段了 。
因為系統發送過來的只是一段文本字符串,所以MySQL服務器要按照SQL語法對這段文本進行解析 。
通過了分析器,說明SQL字符串符合語法規范,現在MySQL服務器要執行SQL語句了 。
MySQL服務器要怎么執行呢?
你需要產出執行計劃,交給MySQL服務器執行,所以來到了優化器階段 。
如外連接轉換為內連接、表達式簡化、子查詢轉為連接、連接順序、索引選擇等一堆東西,優化的結果就是執行計劃 。
截止到現在,還沒有真正去讀寫真實的表,僅僅只是產出了一個執行計劃 。
于是就進入了執行器階段,MySQL服務器終于要執行SQL語句了 。
如果有權限,根據執行計劃調用存儲引擎API對表進行的讀寫 。
講到這里,上面提到的查詢緩存、分析器、優化器、執行器都可以歸納到MySQL的解析與優化組件中 。
所以解析與優化的職責如下:
緩存SQL語法解析驗證SQL優化并生成執行計劃根據執行計劃調用存儲引擎接口
小結
在學習任何知識前,先不要著急的陷入細節,而是先了解大致脈絡,有個全局觀,之后再去深入相關的細節 。
MySql架構分為Server層與存儲引擎層 。
連接管理、解析與優化這些并不涉及讀寫表數據的組件劃分到Server層,讀寫表數據而是交給存儲引擎層來做 。
通過這種架構設計,我們發現Server層其實就是公用層,存儲引擎層就是多態層,按需選擇具體的存儲引擎 。
再細想下,它和模板方法設計模式一模一樣,它們的執行流程是固定的,Servce層等于公用模板函數,存儲引擎層等于抽象模板函數,按需子類實現 。
阿星最后以一張MySQL簡化版的架構圖結束本文,我們下期再見~
《MySQL實戰45講》《從零開始帶你成為MySQL實戰優化高手》《MySQL是怎樣運行的:從根兒上理解MySQL》《MySQL技術Innodb存儲引擎》關于我
阿星是一個熱愛技術的 Java 程序猿,公眾號 「程序猿阿星」 定期分享有趣有料的精品原創文章!
- 查看mysql版本號 查看數據庫版本mysql
- 鐵路12306身份驗證待審核 12306身份認證待核驗
- 保密資質認證標準和辦法,由軍以上單位保密委員會制定 保密資質認證標準和辦法由什么單位制定
- 工程項目管理專家 項目管理專家的認證
- mysql安裝包安裝配置教程 Mysql安裝包
- mysql自動安裝腳本 MySQL一鍵安裝
- mysql誤刪表怎么恢復 mysql刪除表如何恢復數據
- 修改ip地址有用嗎 修改了ip地址會怎樣
- mysql jar包下載安裝教程 java導入mysql驅動包
- 連接MySQL失敗 mysql連接不成功怎么辦
