MySQL架構(面)
和其它資料庫相比,MySQL有點與眾不同,它的架構可以在多種不同場景中應用併發揮良好作用。主要體現在儲存引擎的架構上,外掛式的儲存引擎架構將查詢處理和其它的系統任務以及資料的儲存提取相分離。這種架構可以根據業務的需求和實際需要選擇合適的儲存引擎。
-
連線層:最上層是一些客戶端和連線服務。主要完成一些類似於連線處理、授權認證、及相關的安全方案。在該層上引入了執行緒池的概念,為通過認證安全接入的客戶端提供執行緒。同樣在該層上可以實現基於SSL的安全連結。伺服器也會為安全接入的每個客戶端驗證它所具有的操作許可權。
-
服務層:第二層服務層,主要完成大部分的核心服務功能, 包括查詢解析、分析、優化、快取、以及所有的內建函式,所有跨儲存引擎的功能也都在這一層實現,包括觸發器、儲存過程、檢視等
-
引擎層:第三層儲存引擎層,儲存引擎真正的負責了MySQL中資料的儲存和提取,伺服器通過API與儲存引擎進行通訊。不同的儲存引擎具有的功能不同,這樣我們可以根據自己的實際需要進行選取
-
儲存層:第四層為資料儲存層,主要是將資料儲存在運行於該裝置的檔案系統之上,並完成與儲存引擎的互動
客戶端請求 1、--->聯結器(驗證使用者身份,給予許可權)
聯結器負責跟客戶端建立連線、獲取許可權、管理連線等工作。我們一般是使用命令
mysql -uroot -p
+Enter
後輸入密碼並登入。當輸入密碼提交登入時,MySQL客戶端會與伺服器建立連線,在完成TCP握手後,聯結器就開始確認你所輸入的使用者名稱和密碼。如果使用者名稱密碼正確則成功
2、---> 查詢快取(存在快取則直接返回,不存在則執行後續操作) 往往利弊是同時存在的,查詢快取有著一個致命的缺點,那就是查詢快取失效十分頻繁。這裡所說的查詢快取失效是指的只要有對一個表的更新,這個表上所有的查詢快取都會被清空。 3、---> 分析器(對SQL進行詞法分析和語法分析操作)登陸成功後,聯結器會對你進行許可權驗證,此時許可權驗證都依賴於這時候讀取到的許可權,並根據你的許可權而賦予對資料庫的操作的權力。正是因為許可權驗證對驗證時許可權讀取的依賴問題,也反映出瞭如下注意點!
注意:一個使用者成功建立連線後,即使你用管理員賬號對這個使用者的許可權做了修改,也不會影響已經存在連線的許可權。修改完成後,只有再新建的連線才會使用新的許可權設定。
如果沒有命中快取,那就必須執行SQL語句了。這時候你所寫的查詢語句就到了分析器,分析器先會對SQL語句進行“詞法分析”,它會分析並識別你所輸入的空格、字串和關鍵字都在MySQL中代表了什麼,比如首先它會識別出來select關鍵字、表名、列名和條件。識別了SQL語句的這些後,就到了“語法分析”的階段,它會根據MySQL的語句標準來檢查你所輸入的SQL語句是否符合標準。如果不符合標準就會報出一個“You have an error in your SQL syntax”的語法錯誤提示。
注意:一般語法錯誤提示第一個你所需要關注的是緊接著“use near”的內容,因為它會告訴你哪個語法附近有錯誤!
4、---> 優化器(主要對執行的sql優化選擇最優的執行方案方法) 能進到優化器優化環節的SQL語句,說明在分析器分析的時候沒有出現任何錯誤。那麼優化器對該SQL語句做了些什麼呢?假如一個SQL語句中是有索引的,優化器會根據優化規則選擇合適的索引。或者是一個語句奪標關聯時,優化器決定了各個表之間的連線順序。 ---> 執行器(執行時會先看使用者是否有該表執行許可權,有才去使用這個引擎提供的介面) 開始執行的時候,要先判斷一下你對錶是否有執行查詢的許可權,如果沒有就會報出錯誤的提示資訊。如果有許可權,就開啟表繼續執行。執行器會根據表的引擎來呼叫提供的引擎介面,開始執行。 ---> 去引擎層獲取資料返回(如果開啟查詢快取則會快取查詢結果)