圖解MySQL執行一條SQL的過程
新開一個系列,嘗試把一些常見的面試題做成速記圖,用來面試前臨時抱佛腳。
最近我這個中年老登也在面試,形式所迫也是沒辦法。面試中除了問項目經驗和管理經驗外還經常會被問一些“八股”,說來慚愧,已經快六年沒面過試了,很多以前倒背如流的東西,現在也很難想起來。
這情況就跟高中生高考完以為大學穩了,瘋玩一暑假后發現自己沒錄取上要復讀的感受差不多。
廢話不多說,今天速記指南是:MySQL執行一條SQL語句的過程,這個相信大部分人準備面試的時候都背過,可以再來一起邊聽歌邊快速瀏覽復習一下。
MySQL的基礎架構
想知道SQL語句在MySQL中的執行過程,得先了解一下MySQL的基礎架構,它的架構細節看下面這張圖。
圖片
MySQL 的架構分為:Server 層和 存儲引擎層,他們各自的構成為 :
Server層:
- 連接器
- 查詢緩存
- 分析器
- 優化器
- 執行器
存儲引擎層:
- 各個存儲引擎,實現存儲引擎層定義的統一接口,為Server層提供統一的調用方式。
- 常見的存儲引擎如上圖。
這么多組件,每個都有它們單獨的作用,我把他們都整理到了下面這張圖里。
圖片
Server層:
- 連接器:驗證身份,管理連接
- 查詢緩存:暫存結果集,再次查詢直接返回,v8.0 后不再使用查詢緩存
- 分析器:
詞法分析,讓MySQL知道要干什么 SELECT,還是UPDATE
語法分析,檢查SQL語法錯誤
- 優化器:決定要用索引,連表查詢決定關聯順序
- 執行器:確定對表有操作權限,調用表使用的存儲引擎獲取結構
MySQL基礎架構有了初步了解后,我們來看SQL的執行過程,先來看查詢SQL在MySQL中的執行過程
執行查詢SQL的過程
一條查詢SQL在MySQL中的執行過程,我都整理到下面這張圖了
圖片
- 客戶端:發起查詢,SELECT * FROM T1 WHERE id = 10
- 連接器:
驗證用戶: mysql -h port
驗證失敗: Access denied for user
驗證成功: 查出用戶的權限繼續執行
- 連接完成: 處于 idle, show processlist 可查
- 查詢緩存:命中率很低,v8.0 后被取消
- 分析器:
- 詞法分析: select -> 操作類型 T1 - 操作的表
- 語法分析: 檢查語法錯誤,出現錯誤: ERROR 1064 (42000): You have an error in your SQL syntax
- 優化器:決定怎么查,使用哪個索引,多表join時, join的先后順序
- 執行器:
- 確認有執行權限后 查看 T1 的存儲引擎
- 遍歷調用引擎接口 “滿足條件的下一行”,確定結果id = 10 后返回, 如果查詢無索引,遍歷調用引擎接口“下一行"確認結果id=10后返回。
執行更新SQL的過程
接下來是更新SQL在MySQL中的執行過程,因為過程涉及到不同情況的分支流程,我用一張活動圖把整個過程串了起來,方便大家理解。
圖片
關于redolog、binlog在圖中做了注釋,大家準備面試時不要忽略這部分。