理解MySQL各組件之間如何協調工作,有助于深入理解MySQL服務器,下面展示了MySQL的基本架構圖
圖1-1:Mysql服務器邏輯結構圖
第二層架構包含了大多數MySQL的核心服務功能,包括連接器、查詢緩存、分析器、優化器、執行器等,以及所有的內置函數(如日期、時間、數學和加密函數等),所有跨存儲引擎的功能都在這一層實現,比如存儲過程、觸發器、視圖等。
第三層包含了存儲引擎。存儲引擎負責MySQL中的數據存儲和讀取,每個存儲引擎都有它的優勢和劣勢。服務器通過API與存儲引擎進行通信。
依次看下每個組件的作用:
1.連接器
當客戶端連接到MySQL服務器時,服務器對其進行認證。認證基于用戶名、原始主機信息和密碼。認證通過后服務器會繼續驗證客戶端擁有的權限。之后,這個連接里面的權限判斷邏輯,都將依賴于此時讀到的權限。
2.優化與執行
2.1查詢緩存
對于select語句,在解析查詢之前,服務器會先檢查查詢緩存。如果能在其中找到對應的查詢,服務器直接返回查詢緩存中的結果集。
需要注意的是,MySQL 8.0開始沒有這個功能了。
2.2查詢解析
如果沒有命中查詢緩存,MySQL會解析查詢,并創建內部數據結構(解析樹)。
解析器先會做“詞法解析”。對一條SQL語句,MySQL需要識別出里面的字符串分別是什么,代表什么。
做完了這些識別以后,就要做“語法解析”。根據詞法解析的結果,語法解析器會根據語法規則,判斷輸入的這個SQL語句是否滿足MySQL語法。
2.3優化
經過了解析器,MySQL就知道你要做什么了。在開始執行之前,還要先經過優化器的處理。
如表的讀取順序,重寫查詢,選擇合適對索引等。
2.4執行
MySQL通過分析器知道了你要做什么,通過優化器知道了該怎么做,于是就進入了執行器階段,開始執行語句。
開始執行的時候,要先判斷一下你對這個表有沒有執行查詢的權限,如果沒有,就會返回沒有權限的錯誤
如果有權限,就打開表繼續執行。打開表的時候,執行器就會根據表的引擎定義,去使用這個引擎提供的接口。