一:概述mysql
- 首先須要認識一下 Mysql 總體的基礎架構sql
- 數據庫
二:Mysql 的分層緩存
- MySQL 能夠分爲 Server 層和存儲引擎層兩部分架構
- Server 層函數
- Server 層包括鏈接器、查詢緩存、分析器、優化器、執行器等,涵蓋 MySQL 的大多數核心服務功能。優化
- 以及全部的內置函數(如日期、時間、數學和加密函數等)加密
- 全部跨存儲引擎的功能都在這一層實現,好比存儲過程、觸發器、視圖等。spa
- 存儲引擎層插件
- 而存儲引擎層負責數據的存儲和提取。
- 其架構模式是插件式的,支持 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 動做