一條select的查詢的過程

概述

今天開始簡單瞭解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 來查看執行計劃,而這裏的執行計劃就是優化器作的工做。

執行器

執行器是最終真正執行查詢的步驟,在經歷了分析,優化以後,執行器會以最高效的計劃去進行查詢。
執行器的第一步是判斷該用戶是否有查詢表的權限,若是沒有直接返回錯誤,若是有就會打開表繼續執行。執行器實際上是調用對應表的存儲引擎所提供的接口來進行查詢的。
調用步驟:

  1. 讀取表的第一行,進行條件判斷,若是符合就將結果存儲到結果集,不然跳過;
  2. 調用引擎接口讀取「下一行」,重複相同的邏輯判斷,直到取到表的最後一行;
  3. 執行器將上述變量過程當中全部知足條件的行組成結果集返回給客戶端。

對於有索引的表執行的邏輯差很少,第一次調用的都是「知足條件的第一行」的接口,而後循環調用「知足條件的下一行」接口。

執行器每次調用引擎的接口都會使rows_examined字段加1,可是rows_examined 的值和調用次數並非相等的,由於有時調用引擎的接口會掃描多行的,rows_examined實際是掃描的行數。

存儲引擎

咱們知道數據真正的是存儲在引擎中的,在建立表時能夠指定使用哪一種引擎。這些引擎都是插件式的,而且具體的細節都是不同的如MyISAM,InnoDB,MEMORY等。後面會詳細介紹這些經常使用的引擎。下面就簡單介紹一下每一個引擎的特性。

  • MyISAM
    它不支持事務,也不支持外鍵,尤爲是訪問速度快,對事務完整性沒有要求或者以SELECT、INSERT爲主的應用基本均可以使用這個引擎來建立表。
  • InnoDB
    支持事務,外鍵,通常來講若是須要事務支持,而且有較高的併發讀取頻率,InnoDB是不錯的選擇,並且從MySQL 5.5以後的版本都是默認InnoDB引擎。
  • MEMORY
    數據所有存儲於內存,適合數據量小,響應速度快。

以上是對select查詢過程的簡單分析。不正之處請指正,歡迎留言。 未完待續!!!!!!!

相關文章
相關標籤/搜索