MySQL | 01、MySQL的基本架構示意圖

MySQL的基本架構示意圖

大體來說,MySQL主要可以分爲Server層存儲引擎兩部分。

Server層中主要包括連接器、查詢緩存、分析器、優化器、執行器等,涵蓋MySQL的大部分核心功能服務,以及所有的內置函數(入日期、時間、數學和加密函數等),所有跨存儲引擎的功能都在這一層實現,比如存儲過程、觸發器、視圖等。

存儲引擎主要負責數據的存儲和提取。其架構模式是插件式的,支持InnoDB、MyISAM、Memory等多個存儲引擎。現在最常用的存儲引擎是InnoDB,從MySQL5.5.5版本開始成爲了默認存儲引擎。

在這裏插入圖片描述
從圖中可以看出,不同的存儲引擎共用一個Server層,也就是從連接器到執行器部分。

連接器
負責跟客戶端建立連接、獲取權限、維持和管理連接。Linux中建立連接的命令:

	mysql -h$ip -P$port -u$user -p

(生產環境中,最好在交互對話中輸入密碼,否則存在密碼泄露隱患)

如果用戶名密碼認證通過,連接器會到權限表裏面查出你擁有的權限。之後,這個連接裏面的權限判斷邏輯都將依賴於此時讀取到的權限。

連接完成後,如果沒有後續的動作,這個連接就處於空閒狀態,如果太長時間沒動靜,連接器就會自動斷開,這個時間是由參數wait_timeout控制,默認時間爲8小時。

數據庫裏面,長連接是指連接成功後,如果客戶端持續有請求,則一直使用同一個連接;短連接則是指每次執行完很少的幾次查詢就斷開連接,下次查詢再重新建立一個連接。

因爲數據庫建立連接是比較耗費資源的,所以建議儘量使用長連接,減少建立連接的動作。

針對長連接使用長時間佔用內存資源的情況,有一下兩個方案:

  • 定期斷開長連接,之後再重新連;
  • 如果用的是MySQL5.7或以上版本,可以在每次執行一個較大的操作後,通過執行mysql_reset_connection來重新初始化連接資源。

查詢緩存
MySQL早拿到一條查詢SQL後,就會先到緩存中看看,之前是不是執行過這條語句。之前執行過的語句及其結果可能會以key-value的形式,直接緩存在內存中。如果查詢能夠直接在緩存中找到對應的key,那麼對應的value就會直接返回給客戶端,以提高效率。

但是大多數情況下不建議使用查詢緩存,因爲查詢緩存的實效非常頻繁,只要對錶有一個更新操作,這個表相關的所有的緩存都會被清空。

所以查詢緩存一般適用於靜態表,很長時間纔會更新一次,比如一個系統配置表。

好在MySQL提供了這種“按需使用”的方式。你可以將參數query_cache_type設置成DEMAND,這樣對於默認的SQL語句都不使用查詢緩存。而對於你確定要使用查詢緩存的語句,可以使用SQL_CACHE顯示指定,像下面這個語句一樣:

	select SQL_CACHE * from T where ID=10;

需要注意的是,MySQL8.0版本直接將查詢緩存的整塊功能刪掉了。

分析器
分析器主要工作是做“詞法分析”和“語法分析”。

“詞法分析”就是識別你輸入的SQL中每一個字符串所代表的含義,比如說“select”關鍵字說明這是一個查詢語句,“T”表示的是數據庫中的哪張表,“ID”是哪張表的哪個字段,如果sql中出現表中不存在的字段,這一步就會報錯。

“詞法分析”結束後,語法分析器就開始做“語法分析”,根據MySQL的語法規則,判斷輸入的SQL語句是否滿足規則。

如果輸入的SQL語句不對,就會收到“You have an error in your SQL syntax”的提示,一般語法錯誤會提示第一個出現錯誤的位置,所以你要關注緊接“use near”的內容。

優化器
經過分析器的處理後,MySQL就知道你想要做什麼了,優化器就會根據前面的要求,生成一個最優的執行方案,這個方案主要包含:

  • 表裏多個索引,決定選擇哪個索引;
  • 在一個語句有多表關聯(join)的時候,決定各個表的連接順序等

過於優化器怎麼優化的,後面有待補充。

執行器
負責執行SQL,並返回操作結果。

開始執行SQL的時候,執行器會先判斷你對這個表有沒有對應操作的權限,如果沒有就會返回沒有執行權限的錯誤:

mysql> select * from T where ID=10;
ERROR 1142 (42000): SELECT command denied to user 'b'@'localhost' for table 'T'

如果有權限,就繼續打開表。打開標的時候,執行器就會根據表的引擎定義,去使用這個引擎提供的接口。

以上就是對MySQL基本架構的簡單理解,有不正確或者不足之處,歡迎留言指正。


本篇文章是對極客時間中《MySQL實戰45講》專欄的部分學習整理,原文鏈接:MySQL實戰45講,或者掃碼在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章