前言: 記錄對林曉斌老師的《MySQL 實戰 45 講》課程學習路程。 01 MySQL的基本架構 MySQL的邏輯架構圖 MySQL 分為 Server 層和存儲引擎層兩部分。 Server 層 功能:實現所有 跨存儲引擎 的功能,比如存儲過程、觸發器、視圖等。 連接器、查詢緩存、分析器、優化器、 ...
前言:
記錄對林曉斌老師的《MySQL 實戰 45 講》課程學習路程。
01 MySQL的基本架構
MySQL 分為 Server 層和存儲引擎層兩部分。
Server 層
功能:實現所有 跨存儲引擎 的功能,比如存儲過程、觸發器、視圖等。
連接器、查詢緩存、分析器、優化器、執行器等,以及所有的內置函數(如日期、時間、數學和加密函數等)。
連接器
負責跟客戶端建立連接、獲取許可權、維持和管理連接。
mysql -h$ip -P$port -u$user -p
- 長連接是指連接成功後,如果客戶端持續有請求,則一直使用同一個連接。
- 短連接則是指每次執行完很少的幾次查詢就斷開連接,下次查詢再重新建立一個。
若全部使用長連接後,發現有些時候 MySQL 占用記憶體漲得特別快,從現象看就是 MySQL 異常重啟。
可考慮以下兩種方案解決:
-
定期斷開長連接
-
MySQL 5.7 或更新版本,可以在每次執行一個比較大的操作後,通過執行 mysql_reset_connection 來重新初始化連接資源。
這個過程不需要 重連和重新做許可權驗證 ,但是會將 連接恢復到剛剛創建完時的狀態。
查詢緩存
MySQL 拿到一個查詢請求後,會先到查詢緩存看看,之前是不是執行過這條語句。
之前執行過的語句及其結果可能會以 key-value 對的形式,被直接緩存在記憶體中。key 是查詢的語句,value 是查詢的結果。
如果查詢能夠直接在這個緩存中找到 key,那麼這個 value 就會被直接返回給客戶端。
大多數情況下不要使用查詢緩存。
因為查詢緩存的失效非常頻繁,只要有對一個表的更新,這個表上所有的查詢緩存都會被清空。
需要註意的是,MySQL 8.0 版本直接將查詢緩存的整塊功能刪掉了。
分析器
對 SQL 語句做解析,MySQL 需要識別出裡面的字元串分別是什麼,代表什麼。
先會做“詞法分析“(識別是什麼語句,比如通過select關鍵字,識別出這是查詢語句),
然後做“語法分析”(判斷輸入 SQL 語句是否滿足 MySQL 語法)。
一般語法錯誤會提示第一個出現錯誤的位置,所以你要關註的是緊接“use near”的內容。
優化器
優化器是在表裡面有多個索引的時候,決定使用哪個索引;或者在一個語句有多表關聯(join)的時候,決定各個表的連接順序。
執行器
MySQL 通過分析器知道了你要做什麼,通過優化器知道了該怎麼做,於是就進入了執行器階段,開始執行語句。
開始執行的時候,要先判斷一下對這個表 T 有沒有執行查詢的許可權。
如果有許可權,就打開表繼續執行。打開表的時候,執行器就會根據表的引擎定義,去使用這個引擎提供的介面。
存儲引擎層
負責數據的存儲和提取。其架構模式是插件式的。
引擎類型預設InnoDB。
不同的存儲引擎共用一個 Server 層。