在日常執行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,這次就說一下執行流程,就到這.
本人也是學習者,如果有誤還請指出,本人會進行修改.