共計 1953 個字符,預計需要花費 5 分鐘才能閱讀完成。
自動寫代碼機器人,免費開通
這篇文章將為大家詳細講解有關 MySQL 架構組件的示例分析,丸趣 TV 小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
總體架構
一. 連接器
??連接器主要負責跟客戶端建立連接、權限驗證和管理連接,可以使用命令 show processlist 查看連接信息。當一個用戶連接創建成功之后,權限信息就已經讀入內存,之后再修改該用戶的權限,如果不刷新的話,則無法生效。
??對于一個連接,如果長時間沒有收到指令(處于空閑狀態),那么達到一定的時間之后,連接器會斷開這個鏈接。這個時間由參數 wait_timeout 控制,默認為 8 小時。
??連接器中的連接分為長連接和短連接:
長連接:連接成功后,客戶端請求使用同一個連接
短連接:每次執行完請求后會斷開連接,再有請求會重新建立連接
??由于在平時我們一般為了避免頻繁反復創建連接的開銷,都是使用的長連接,也就是長期維持一個連接不斷開。但是要注意,一個連接管理了其在使用過程中占用的一些內存,會在連接斷開的時候隨連接一起釋放。如果連接不斷開,長期不處理一直堆積,則可能導致內存占用過大,被系統強殺。一般有兩個解決方案:
定期斷開長連接,每隔一段時間或執行一個占用大量內存的查詢之后斷開連接,從而釋放內存,當需要查詢的時候再重新創建連接
5.7 之后的版本可以使用 mysql_reset_connection 來重新初始化連接資源,不需要重新連接和權限驗證,而將連接恢復到新建時的狀態。同時也會有一些其它影響,比如釋放表鎖、清除臨時表、重置會話中設置的變量等等
二、查詢緩存
注:查詢緩存 8.0 版本后被廢除
??連接創建成功之后就可以執行 SQL 語句了,不過如果開啟了查詢緩存,那么在真正分析 SQL 之前會先從緩存中查詢,如果緩存命中則直接返回。查詢緩存就是一個 Key-Value 結構,Key 是 SQL 語句,Value 是對應的查詢結果。如果緩存未命中,就會繼續后面的查詢操作。查詢完成之后,會把結果存入查詢緩存中。
??為什么查詢緩存會被刪除呢?因為查詢緩存通常弊大于利。如果對一個表進行更新,那么這個表對應的查詢緩存都會被清空,對于經常更新的表,查詢緩存的失效會非常頻繁,基本就不起作用,而且還有更新緩存的開銷。對于那種基本會保持不變的數據表,倒是可以選擇使用查詢緩存,比如系統配置表等,這種表的緩存命中率會高些,可能能做到利大于弊,不過對于這種配置,我們還可以使用外部緩存。
??通過參數 query_cache_type 可以配置查詢緩存,該參數有 3 個可選值,分別為:
0:關閉查詢緩存
1:開啟查詢緩存
2:當 SQL 中有 SQL_CACHE 關鍵詞時使用查詢緩存,比如 select SQL_CACHE * from t where xxx;
三、分析器
??如果查詢緩存沒有命中,那么 SQL 就需要真正得到執行,在執行之前需要對 SQL 進行解析,這個解析主要分為詞法分析和語法分析兩個步驟。
詞法分析:從 SQL 中提取關鍵詞,比如 select、from、表名、字段名等等
語法分析:根據詞法分析的結果和 MySQL 定義的一些語法規則檢查 SQL 語法是否合法,最終會生成一顆抽象語法樹(AST)
四、優化器
??優化器以分析器生成的 AST 為輸入,對 SQL 進行優化,生成優化器認為的最優執行方案,交給執行器執行。優化過程包括 SQL 的邏輯轉換和代價計算。
??邏輯轉化就類似于 Java 的靜態編譯期優化,會對 SQL 進行一些 簡化,保證 SQL 轉換前后執行結果一致。比如,where 1=1 and a.id = 2,可以相當于 where a.id = 2。
??代價計算的主要目的是選擇 SQL 執行的方式,包括是否使用索引、使用哪個索引、多表連接使用什么順序等。代價分為服務層代價和引擎層代價,服務層代價主要是 CPU 相關,引擎層代價則主要是磁盤 I / O 相關。MySQL 5.7 引入了兩個系統表 mysql.server_cost 和 mysql.engine_cost 來配置這兩種代價,表中配置的就是各種操作對應的代價,比如臨時表創建、排序、頁讀取等等。
??優化器會根據生成的查詢計劃和上述兩種代價配置來計算一個查詢計劃的最終代價,在多個查詢計劃中選擇代價最小的那一個交給執行器執行。但是要注意,代價最小,有時候并不一定代表執行時間就最短。
五、執行器
??執行器會根據優化器選擇的查詢計劃去執行 SQL,執行之前還會校驗請求用戶是否擁有對應的查詢權限,最終調用 MySQL 引擎層提供的接口,執行 SQL 語句并且返回結果。如果開啟了查詢緩存,結果還會存儲在查詢緩存中。
關于“MySQL 架構組件的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
向 AI 問一下細節