一:概述
- 首先需要認識一下 Mysql 整體的基礎架構
-
二:Mysql 的分層
- MySQL 可以分為 Server 層和存儲引擎層兩部分
- Server 層
- Server 層包括連接器、查詢緩存、分析器、優化器、執行器等,涵蓋 MySQL 的大多數核心服務功能。
- 以及所有的內置函數(如日期、時間、數學和加密函數等)
- 所有跨存儲引擎的功能都在這一層實現,比如存儲過程、觸發器、視圖等。
- 存儲引擎層
- 而存儲引擎層負責數據的存儲和提取。
- 其架構模式是插件式的,支持 InnoDB、MyISAM、Memory 等多個存儲引擎。
- 現在最常用的存儲引擎是 InnoDB,它從 MySQL 5.5.5 版本開始成為了默認存儲引擎。
三:執行流程
- 1:連接器
- 當在 Shell 中連接 Mysql 服務(mysql -h$ip -P$port -u$user -p)在完成 TCP 握手連接之后,連接器即開始身份認證
- 如果用戶名或密碼不對,你就會收到一個"Access denied for user"的錯誤,然后客戶端程序結束執行。
- 如果用戶名密碼認證通過,連接器會到權限表里面查出你擁有的權限。
- 之后,這個連接里面的權限判斷邏輯,都將依賴於連接時讀到的權限。
- PS
- 根據這里的身份認證可以知道,權限的認證,是在連接 Mysql 時完成的。
- 所以,即使管理員在連接狀態時修改了權限,也不會影響已經存在的連接。之后的鏈接才會使用新的權限狀態。
- 每個連接的鏈接狀態
- show processlist;
- 客戶端如果太長時間沒動靜,連接器就會自動將它斷開。
- 這個時間是由參數 wait_timeout 控制的,默認值是 8 小時。
- 如果在連接被斷開之后,客戶端再次發送請求的話,就會收到一個錯誤提醒: Lost connection to MySQL server during query。
- 這時候如果你要繼續,就需要重連,然后再執行請求了。
- 長鏈接/短連接
- 數據庫里面,長連接是指連接成功后,如果客戶端持續有請求,則一直使用同一個連接。
- 短連接則是指每次執行完很少的幾次查詢就斷開連接,下次查詢再重新建立一個。
- PS:
- 長鏈接過多會導致 Mysql 的內存使用快速增長。
- 這是因為 MySQL 在執行過程中臨時使用的內存是管理在連接對象里面的。
- 這些資源會在連接斷開的時候才釋放。
- 所以如果長連接累積下來,可能導致內存占用太大,被系統強行殺掉(OOM),從現象看就是 MySQL 異常重啟了。
- 解決
- 定期斷開長連接並重啟。
- 如果你用的是 MySQL 5.7 或更新版本,可以在每次執行一個比較大的操作后,通過執行 mysql_reset_connection 來重新初始化連接資源。
- 2:查詢緩存
- MySQL 拿到一個查詢請求后,會先到查詢緩存查詢
- 如果你的查詢能夠直接在這個緩存中找到 key,那么這個 value 就會被直接返回給客戶端。
- 但是大多數情況下我會建議你不要使用查詢緩存,為什么呢?因為查詢緩存往往弊大於利。
- 查詢緩存的失效非常頻繁,只要有對一個表的更新,這個表上所有的查詢緩存都會被清空。
- 因此很可能你費勁地把結果存起來,還沒使用呢,就被一個更新全清空了。
- 對於更新壓力大的數據庫來說,查詢緩存的命中率會非常低。
- 除非你的業務就是有一張靜態表,很長時間才會更新一次。
- 比如,一個系統配置表,那這張表上的查詢才適合使用查詢緩存。
- 在 MySQL 8.0 中,緩存功能徹底被廢棄。
- 3:分析器
- 解析SQL 語句
- 分析整個的 SQL 動作