今天開始簡單瞭解mysql的一些底層技術,而再也不只知增刪改查。mysql
select * from tab
複製代碼
可能這是史上最簡單的一條SQL了吧,其所表達的意思我也就很少說了,那麼這麼簡單的一條語句從客戶端發送到MySQL服務器,以及從服務器返回查詢的結果到底是經歷怎麼樣一個過程呢?
胖子不是一口吃成的,因此下面我也只是簡單描述這其中的步驟,並不會追求描述每個步驟的具體實現細節。而細節後面我會抽空將本身的一些研究進行整理併發出來。sql
PS:最近發現腦圖真的是一個好東西,方便本身整理和記憶,並且有些只可意會不可言傳的都在圖中了。緩存
圖中的數字標記的是MySQL中執行順序。
bash
顧名思義鏈接器 就是負責服務端處理客戶端和服務端的連接。衆所周知MySQL是基於TCP來進行命令交互的,並且這些鏈接都是長鏈接,因此必須進行管理。若是某個鏈接長時間處於空閒的狀態Server端將主動將這些鏈接進行關閉,這個時間默認是8小時,能夠對wait_time進行設置。這也是爲啥在客戶端會有複用鏈接池和設置鏈接池大小的緣由。
鏈接器同時還會對鏈接進行用戶和權限的檢查。服務器
若是所有使用長鏈接時間累積下來可能會致使內存佔用太大,會被系統強行殺掉(OOM),從而致使MySQL異常重啓。解決辦法能夠是按期斷開長鏈接。併發
在Server會有每次查詢的緩存,緩存是以key-value的形式存儲的。
鏈接結束後,默認會進行緩存查詢,緩存的key就是客戶端發送過來的完整的sql語句,若是命中緩存,就會直接返回結果,不須要往下繼續進行了。優化
雖然緩存的效率會很是高,可是大多數狀況下緩存的命中率會很是低,緣由是當對一個表進行了更新操做,那麼這個表上面的全部查詢緩存都會被清空。spa
能夠經過將參數query_cache_type 設置成DEMAND ,這樣默認SQL語句不會查詢緩存了,而可使用SQL_CACHE顯示指定查詢緩存,以下語句:插件
select SQL_CACHE * from tab;
複製代碼
MySQL 8.0版本直接將查詢緩存功能刪除了!!!! [尷尬的笑了]code
當緩存沒有命中,那麼SQL語句就會執行到這裏了,此時Server會對你的SQL進行解析。
首先作「詞法解析」,將全部的「詞」識別出來,如select,insert,update等,還有代表,列名等等。識別完成後進行「語法解析」,判讀SQL語句是否知足MySQL的語法。通常語法錯誤會提示第一個出現錯誤的位置。
優化器的目的是使查詢更加的高效。
優化器的工做會在表裏面存在多個索引時選擇使用哪一個索引;有多表關聯時決定各個表的連接順序。咱們一般會在分析一條SQL語句時,使用explain 來查看執行計劃,而這裏的執行計劃就是優化器作的工做。
執行器是最終真正執行查詢的步驟,在經歷了分析,優化以後,執行器會以最高效的計劃去進行查詢。
執行器的第一步是判斷該用戶是否有查詢表的權限,若是沒有直接返回錯誤,若是有就會打開表繼續執行。執行器實際上是調用對應表的存儲引擎所提供的接口來進行查詢的。
調用步驟:
對於有索引的表執行的邏輯差很少,第一次調用的都是「知足條件的第一行」的接口,而後循環調用「知足條件的下一行」接口。
執行器每次調用引擎的接口都會使rows_examined字段加1,可是rows_examined 的值和調用次數並非相等的,由於有時調用引擎的接口會掃描多行的,rows_examined實際是掃描的行數。
咱們知道數據真正的是存儲在引擎中的,在建立表時能夠指定使用哪一種引擎。這些引擎都是插件式的,而且具體的細節都是不同的如MyISAM,InnoDB,MEMORY等。後面會詳細介紹這些經常使用的引擎。下面就簡單介紹一下每一個引擎的特性。
以上是對select查詢過程的簡單分析。不正之處請指正,歡迎留言。 未完待續!!!!!!!