select * from tb where ID = 1
下面解析的查詢過程都是基於上面的簡單查詢,該系列的所有素材都來自於丁奇的mysql的45講
1、建立連接
a、客戶端發出請求,請求首先到達連接器,然后連接器去校驗用戶名和密碼,如果校驗通過,則去權限表讀取該用戶的權限,並且之后該連接的所有操作都是基於該次權限的讀取。
b、如果你在這次連接建立之后,再用管理員賬號去修改該用戶的賬號權限,也不會對該次連接的后續操作生效,除非再次建立個新的連接;一個連接建立之后如果沒有后續操作,則該連接處於空閑狀態;如果長時間沒有動靜,則連接器會自動斷開該次連接,這個時間由參數指定(wait_timeout),默認是8個小時。
2、查詢緩存
a、連接建立之后就開始查詢緩存:mysql收到一個請求之后會先去查詢緩存,看看這條語句是否被執行過,之前執行過的語句和結果會以鍵值對的形式存在緩存中,如果在緩存中查到了該語句,則會將結果直接返回給客戶端。如果沒有查詢到,則會繼續執行后面的流程,同時會將查詢的結果放到緩存中;需要注意的是查詢緩存失效非常頻繁,只要有對表的更新,那么這個表中所有的緩存都會被清空,是否需要查詢緩存,mysql都有參數設置,按需設值,在后續8.0的版本中,查詢緩存的功能將會被刪除掉。
3、分析器
a、這一步是該條查詢語句沒有命中緩存的時候才到這里,首先分析器會對你的sql語句做詞法分析,然后再做語法分析。詞法分析:mysql需要把sql語句識別出來,哪個字符串代表什么,select會被識別為查詢,tb會被識別為表,字符串ID會被識別為列ID;做完這些分析之后,再去做語法分析:根據詞法分析的結果,語法分析會根據語法分析的結果判斷sql是不是滿足MYSQL語法規則,如果不滿足,則會拋出一個錯誤。
4、優化器
a、一條sql經過分析器之后,mysql就知道他要干嘛了,這時候並不是把sql拿去執行,這中間還有一個優化器,這個優化器是在該表有多個索引或者多表關聯的時間決定用哪個索引或者決定哪條子查詢先執行,總體來說就是選擇效率最高的一種方案來執行。
5、執行器
a、在經過了分析器和優化器之后,sql才能到達執行器被真正執行。在開始執行的時候,首先會判斷該次連接的對象對該表是否有操作權限。如果沒有則返回權限不足的錯誤,如果有權限就繼續打開表執行,在打開表的時候,執行器會根據表的引擎定義去使用這個引擎提供的接口。
b、以上面的查詢語句為例,假設該表沒有索引,執行器的具體流程是:調用InnoDB引擎接口取這個表的第一行,並判斷該ID的值是不是等於1,如果不是則跳過,如果是則將這行存到結果集中並且繼續去取下一行數據,判斷邏輯相同,知道取到該表的最后一行,最后執行器將上面所有滿足條件的行組成記錄集作為結果集返回給客戶端。至此,一條sql的執行流程就走完了。