邏輯架構圖
一條sql語句是如何在mysql的各個功能模塊中執行的?
連接器
連接器負責跟客戶端建立連接,獲取權限,維持和管理連接。
步驟:
- 驗證用戶名和密碼
- 根據用戶名和密碼認證當前連接所擁有的權限
- 連接完成後,若沒有後續動作則連接處於空閒狀態。
查詢緩存
連接建立完成就可以執行sql語句了,此時會先查詢緩存,看之前是否執行過這條sql, 之前執行過的sql和結果會以key,value的形式被直接緩存在內存中,key是查詢語句,value是查詢結果。如果可以命中緩存,將大幅提高查詢效率。
但大多數情況下,不建議使用查詢緩存,mysql8.0也將查詢緩存的功能刪掉了。原因是查詢緩存的弊大於利,查詢緩存的失效十分頻繁,只要有對一個表的更新。這個表所有的查詢緩存都會被清空,因此當我們費時的將緩存結果存起來,還沒來得及使用時就已經被清空掉了。
所以,對於更新壓力大的數據庫來說,查詢緩存命中率會非常低。
分析器
分析器對sql語句做解析,會做詞法分析和語法分析,判斷表是否存在,列是否存在,sql語句是否正確。如果你的sql語句不對,就會收到錯誤提示:
ERROR 1064 (42000): You have an error in your SQL syntax;
優化器
經過分析器,mysql知道你要做什麼,但是在執行sql之前,需要經過優化器來決定怎麼做。
比如我們建了多個索引時,優化器會決定使用哪個索引;有多表關聯時,優化器來決定各個表的連接順序,執行器會去選擇方案已達到最優的效率。
執行器
優化器階段完成之後,sql語句的執行方案就已確定了,然後進入執行器階段。執行器會根據執行方案來執行語句,先驗證權限然後打開表,根據表的引擎定義去使用該引擎提供的接口,最後將處理sql得到的結果集返回給客戶端。
mysql機讀順序