MySQL資料庫的架構
MySQL 包含 Server 層和存儲引擎層兩大部分。
存儲引擎層
負責資料的存儲和提取,MySQL 采用插件式的存儲引擎,常見的存儲引擎有
- InnoDB
- MyISAM
- CSV
其中 InnoDB 是最常用的存儲引擎,也是 MySQL 的預設存儲引擎
Server 層
- 連接配接池: 用來身份認證和權限驗證
- 查詢緩存: 執行查詢語句的時候,會先查詢緩存,命中緩存之間傳回
- 分析器: 沒有命中緩存的話,SQL 語句就會經過分析器,檢查你的 SQL 語句文法是否正确,分析你的 SQL 語句要幹什麼
- 優化器: 優化成最優的執行方案去執行
- 執行器: 執行優化後的語句,然後從存儲引擎傳回資料

連接配接器
- 連接配接器主要和身份認證和權限相關的功能相關,類似哨兵
- 主要負責使用者登入資料庫,進行使用者的身份認證,包括校驗賬戶密碼,權限等操作
查詢緩存
MySQL 查詢不建議使用緩存,因為查詢緩存經常失效,是以大多數情況下都是不去使用查詢緩存的。
- 查詢緩存主要用來緩存我們所執行的 SELECT 語句以及該語句的結果
- 連接配接建立後,執行查詢語句的時候,會先查詢緩存,如果緩存 key 被命中,就會直接傳回給用戶端,如果沒有命中,就會執行後續的操作
- 查詢完成後也會把結果緩存起來,友善下一次調用
- 真正執行緩存查詢的時候還是會校驗使用者的權限,判斷該使用者是否有查詢權限
分析器
如果 沒有命中緩存,那麼就會進入分析器,分析器主要是用來分析 SQL 語句是來幹什麼的,分為兩步
- 詞法分析,一條 SQL 語句有多個字元串組成,首先要提取關鍵字,比如 select,提出查詢的表,提出字段名,提出查詢條件等等
- 文法分析,主要就是判斷你輸入的 sql 是否正确,是否符合 MySQL 的文法
優化器
- 優化器的作用就是它認為的最優的執行方案去執行
- 例如如多個索引的時候該如何選擇索引
- 經過了優化器之後就可以讓執行器去執行sql了
執行器
- 首先執行前會校驗該使用者有沒有權限,如果沒有權限,就會傳回錯誤資訊
- 如果有權限,就會去調用引擎的接口,傳回接口執行的結果。
一條查詢語句如何執行
select name from student where age= '18' and sex = '女'
我們分析下這個語句的執行流程:
- 先檢查該語句是否有權限,如果沒有權限,直接傳回錯誤資訊
- 如果有權限,在 MySQL8.0 版本以前,會先查詢緩存,如果命中緩存之,間傳回,如果沒有,執行下一步。
- 通過分析器進行詞法分析,提取 sql 語句的關鍵元素,比如提取上面這個語句是查詢 select,提取需要查詢的表名為 student,需要查詢名為name的列,查詢條件是這個表的 age='18’和sex=‘女’。
- 判斷這個 sql 語句是否有文法錯誤,比如關鍵詞是否正确等等,如果錯誤就執行下一步。
- 接下來就是優化器進行确定執行方案,上面的 sql 語句,可以有兩種執行方案,優化器會根據自己的優化算法選擇執行效率最好的一個方案
- 先查詢學生表中age為“18”的學生,然後判斷是否sex=女。
- 先找出學生中sex=女的學生,然後再判斷是否age=18
- 進行權限校驗,如果沒有權限就會傳回錯誤資訊,如果有權限就會調用資料庫引擎接口,傳回引擎的執行結果給用戶端
總結
權限校驗—>查詢緩存—>分析器—>優化器—>權限校驗—>執行器—>執行引擎