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