mysql基礎架構
MySQL 主要分為 Server 層和 存儲引擎層:
Server 層:主要包括 連接器、查詢緩存、分析器、優化器、執行器等,所有跨存儲引擎的功能都在這一層實現,比如存儲過程、觸發器、視圖,函數等,還有一個通用的日志模塊 binglog 日志模塊。
存儲引擎: 主要負責數據的存儲和讀取。
名詞解釋:
連接器: 身份認證和權限相關(登錄 MySQL 的時候)。
查詢緩存: 執行查詢語句的時候,會先查詢緩存(MySQL 8.0 版本后移除,因為這個功能不太實用)。
分析器: 沒有命中緩存的話,SQL 語句就會經過分析器,分析器主要分析你的 SQL 語句要干嘛,再檢查你的 SQL 語句語法是否正確。
優化器: 按照 MySQL 認為最優的方案去執行。
執行器: 執行語句,然后從存儲引擎返回數據。
查詢sql語句的執行流程:
- 1、先檢查該語句是否有權限,如果沒有權限,直接返回錯誤信息。如果有權限,在 MySQL8.0 版本以前,會先查詢緩存,以這條 sql 語句為 key 在內存中查詢是否有結果,如果有直接緩存,如果沒有,執行下一步。)
- 2、通過分析器進行分析,先詞法分析,提取關鍵字,提出查詢的表,提出字段名,提出查詢條件等等;再語法分析,主要判斷你輸入的 sql 是否正確,是否符合 MySQL 的語法。
- 3、優化器進行確定執行方案。
- 4、還要進行權限校驗,如果沒有權限就會返回錯誤信息,如果有權限就會調用數據庫引擎接口,返回引擎的執行結果。
更新sql語句的執行流程:
基本上會沿查詢的流程走,但執行更新的時候要記錄日志,此時日志模塊有:MySQL 自帶的日志模塊式 binlog(歸檔日志) ,所有的存儲引擎都可以使用;InnoDB 引擎還自帶了一個日志模塊 redo log(重做日志)。
在 InnoDB 模式下來更新sql語句的執行流程如下:
- 先查詢到張三這一條數據,如果有緩存,也是會用到緩存。
- 然后拿到查詢的語句,進行更新,然后調用引擎 API 接口,寫入這一行數據,InnoDB 引擎把數據保存在內存中,同時記錄 redo log,此時 redo log 進入 prepare 狀態,然后告訴執行器,執行完成了,隨時可以提交。
- 執行器收到通知后記錄 binlog,然后調用引擎接口,提交 redo log 為提交狀態。
- 更新完成。