MySQL架構設計思想詳解
前言
很多開發同學對SQL優化如數傢珍,卻對MySQL架構一知半解。豈不是隻見樹葉,不見森林,終將陷入細節中不能自拔。
今天就一塊學習MySQL分層架構,深入瞭解MySQL底層實現原理,以及每層的作用,我們常見的SQL優化到底在哪一層做瞭優化?
1. MySQL整體架構
由圖中可以看到MySQL架構主要分為Server層和存儲引擎層。
Server層又分為連接器、緩存、分析器、優化器、執行器。所有跨存儲引擎的功能都在這層實現,比如:函數、存儲過程、觸發器、視圖等。
存儲引擎是可插拔式的,常見的存儲引擎有MyISAM、InnoDB、Memory等,MySQL5.5之前默認的是MyISAM,之後默認的是InnoDB。
2. 連接器
連接器主要用來管理客戶端的連接和用戶身份認證。
客戶端與Server端的連接采用的是TCP協議,經過TCP握手,建立連接之後,連接器開始進行身份驗證。
> mysql -hlocalhost -P3306 -uroot -p
如果認證失敗,就會出現錯誤 ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)。
可以通過 show processlist 命令查看系統所有連接的信息:
其中Commond列表示連接狀態,Daemon表示後臺進程,Query表示查詢,Sleep表示空閑連接。
3. 查詢緩存
客戶端請求不會直接去存儲引擎查詢數據,而是先在緩存中查詢結果是否存在。如果結果已存在,直接返回,否則再執行一遍查詢流程,查詢結束後把結果再緩存起來。
如果數據表發生更改,將清空失效緩存,例如 insert、update、delete、alter操作等。
對於頻繁變更的數據表來說,緩存命中率很低。使用緩存反而降低瞭讀寫性能,所以在MySQL8.0以後就移除瞭緩存模塊。
可以通過下面命令查看是否開啟瞭緩存:
4. 分析器
分析器主要對SQL語句進行詞法分析和語法分析。
首先進行詞法分析,分析出MySQL的關鍵字、以及每個詞語代表的含義。然後進行語法分析,檢測SQL語句是否符合MySQL語法要求。
MySQL通過識別字符串中列名、表名、where、select/update/insert 等MySQL關鍵字,在根據語法規則判斷sql是否滿足語法,最終會生成一個抽象語法樹(AST)。
比如:SQL語句中少寫個where關鍵字,就會提示錯誤。
mysql> select * from user id=1; ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '=1' at line 1
5. 優化器
在真正執行SQL語句之前,還需要經過優化器處理。
我們熟知的執行計劃(Explain)就是優化器生成的。
優化器主要有兩個作用:邏輯優化和物理優化。
邏輯優化主要進行等價謂詞重寫、條件化簡、子查詢消除、連接消除、語義優化、分組合並、選擇下推、索引優化查詢、表查詢替換視圖查詢、Union替換or操作等。
物理優化主要作用是通過貪婪算法,根據代價估算模型,估算出每種執行方式的代價。並使用索引優化表連接,最終生成查詢執行計劃。
附上MySQL優化器架構圖,可以清晰的看到優化過程:
如果想知道優化器估算結果信息,可以通過Explain查看,關註一燈架構,下篇文章會詳細講解Explain具體用法。
6. 執行器
在優化器優化完SQL,並生成瞭執行計劃後,就會把執行計劃傳遞給執行器。
執行器調用存儲引擎接口,真正的執行SQL查詢。獲取到存儲引擎返回的查詢結果,並把結果返回給客戶端,至此SQL語句執行結束。
7. 總結
本篇文章主要帶大傢瞭解瞭MySQL分層架構,以及每層的架構的作用。可以看出MySQL每層架構分工明確、邏輯清晰,深刻地體現瞭架構設計中“高內聚,低耦合”的設計思想。我們平時在做架構設計的時候,也要多學習一下這種分層架構的設計思想。
到此這篇關於MySQL架構設計思想詳解的文章就介紹到這瞭,更多相關MySQL架構設計內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- SQL查詢語句執行的過程
- MySQL在grant時報錯ERROR 1064 (42000)的原因及解決方法
- 詳解MySQL數據庫千萬級數據查詢和存儲
- MySQL創建高性能索引的全步驟
- MySQL中order by的使用詳情