在日常執行mysql語句的過程中,都是客戶端進程向伺服器進程發送一段文本(MySQL語句),伺服器進程處理後再向客戶端進程發送一段文本(處理結果). 看似很簡單,其實不然,這內容有很多東西是需要註意的.下麵借用兩張圖來說明,其實兩張圖表示的意思都是一樣. 上面的圖對於中間的解析和優化不是很透徹,下麵 ...
在日常執行mysql語句的過程中,都是客戶端進程向伺服器進程發送一段文本(MySQL語句),伺服器進程處理後再向客戶端進程發送一段文本(處理結果). 看似很簡單,其實不然,這內容有很多東西是需要註意的.下麵借用兩張圖來說明,其實兩張圖表示的意思都是一樣.
上面的圖對於中間的解析和優化不是很透徹,下麵的圖將解析和優化說的更明確.
接下來就分開說明下:
連接管理/連接器
連接器就是用來客戶端和伺服器進程之間建立連接的,這個方式有很多,比如說TCP/IP,命名管道或共用記憶體等等,這個階段的連接需要客戶端提供主機信息,用戶名以及密碼,伺服器會對提供的信息進行認證,不僅僅是賬戶密碼的匹配,還有許可權的驗證.
解析優化
解析優化階段是非常重要的一個階段,主要包括了查詢緩存(8中取消),語法解析和查詢優化.
查詢緩存
這個的意思的Mysql伺服器程式處理請求,會把剛剛請求過的查詢請求和結果緩存起來,,下一次有一模一樣的請求過來,直接從緩存中查找結果會更快.如何緩存的呢?其實就是鍵值對的形式,鍵就是查詢的sql語句,值就是查詢出來的結果.
註意重點是一模一樣,也就是出現雖然查詢的結果一樣,但是不會命中緩存的情況. 也就是兩個查詢請求在任何字元上的不同(例如:空格、註釋、大小寫),都會導致緩存不會命中。還有,如果查詢請求中包含某些系統函數、用戶自定義變數和函數、一些系統表,如 mysql 、information_schema、 performance_schema 資料庫中的表,那這個請求就不會被緩存。
緩存什麼失效呢? Mysql的緩存系統會檢測涉及到每張表,只要該表的結構或者數據被修改,如對該表使用了INSERT、 UPDATE、DELETE、TRUNCATE TABLE、ALTER TABLE、DROP TABLE或 DROP DATABASE語句,那使用該表的所有高速緩存查詢都將變為無效並從高速緩存中刪除!
至於在Mysql8中為什麼會取消緩存?是因為維護緩存會造成部分開銷,所以就取消了.
語法解析
如果緩存沒有命中呢? 那麼接下來才是真正的開始執行,當伺服器接收到sql語句的時候,並不會立即執行,而是進行分析,包括了詞法分析,語法分析,語義分析等. 詞法分析會分析出這條sql語句的關鍵詞,表名和列名等等.語法分析則會分析這條sql語句是否有錯誤,比如關鍵字select是否正確等,至於語義分析,我的感覺就是分析出這條語句是查詢,修改還是刪除等,這個下去再研究下.
語法解析就是上面的樣子.
查詢優化
mysql會對我們寫的sql語句進行一些優化,如外連接轉換為內連接、表達式簡化、子查詢轉為連接等,優化的結果就是生成一個執行計劃,這個計劃表名該sql語句會使用什麼索引進行查詢,執行的順序是什麼,這個很重要, 我們可以通過explain語句來查看某個語句的執行計劃.
執行
上面那麼多操作都還沒有開始真正的查詢數據,真正的查詢數據就交給執行器來做把,在真正開始執行前會判斷當前用戶是否有操作的許可權,有的話會根據操作表的結構去存儲引擎操作,mysql伺服器把數據的存儲和提取操作都封裝在存儲引擎中,至於存儲引擎中怎麼存儲,這個以後再詳細瞭解.
不過要知道的是mysql的存儲引擎有很多,最最常見的就是InnoDB和MyISAM了,我的印象中這兩個的最大區別就是前者支持事務,後者不支持事務.至於存儲方面我下午再研究一下. 不過重點應該放在InnoDB,這次就說一下執行流程,就到這.
本人也是學習者,如果有誤還請指出,本人會進行修改.