一條select的查詢的過程

努力的碼農發表於2019-03-01

概述

今天開始簡單瞭解mysql的一些底層技術,而不再只知增刪改查。

select * from  tab
複製程式碼

可能這是史上最簡單的一條SQL了吧,其所表達的意思我也就不多說了,那麼這麼簡單的一條語句從客戶端傳送到MySQL伺服器,以及從伺服器返回查詢的結果究竟是經歷怎麼樣一個過程呢?
胖子不是一口吃成的,所以下面我也只是簡單描述這其中的步驟,並不會追求描述每一個步驟的具體實現細節。而細節後面我會抽空將自己的一些研究進行整理併發出來。

PS:最近發現腦圖真的是一個好東西,方便自己整理和記憶,而且有些只可意會不可言傳的都在圖中了。

一條select的查詢的過程

圖中的數字標記的是MySQL中執行順序。

聯結器

顧名思義聯結器 就是負責服務端處理客戶端和服務端的連結。眾所周知MySQL是基於TCP來進行命令互動的,而且這些連線都是長連線,所以必須進行管理。如果某個連線長時間處於空閒的狀態Server端將主動將這些連線進行關閉,這個時間預設是8小時,可以對wait_time進行設定。這也是為啥在客戶端會有複用連線池和設定連線池大小的原因。
聯結器同時還會對連線進行使用者和許可權的檢查。

如果全部使用長連線時間累積下來可能會導致記憶體佔用太大,會被系統強行殺掉(OOM),從而導致MySQL異常重啟。解決辦法可以是定期斷開長連線。

查詢快取

在Server會有每次查詢的快取,快取是以key-value的形式儲存的。
連線結束後,預設會進行快取查詢,快取的key就是客戶端傳送過來的完整的sql語句,如果命中快取,就會直接返回結果,不需要往下繼續進行了。

雖然快取的效率會非常高,但是大多數情況下快取的命中率會非常低,原因是當對一個表進行了更新操作,那麼這個表上面的所有查詢快取都會被清空。

可以通過將引數query_cache_type 設定成DEMAND ,這樣預設SQL語句不會查詢快取了,而可以使用SQL_CACHE顯示指定查詢快取,如下語句:

select SQL_CACHE * from tab;
複製程式碼

MySQL 8.0版本直接將查詢快取功能刪除了!!!! [尷尬的笑了]

分析器

當快取沒有命中,那麼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查詢過程的簡單分析。不正之處請指正,歡迎留言。
未完待續!!!!!!!

相關文章