作者:小胖學編程
連結:https://www.jianshu.com/p/b3add5abb7c1
長按下方二維碼↓↓↓
回復 527252免費獲取
問題
一般會遇見如下的問題:
mysql框架有幾個組件,各有什麼作用?
見下文
server層和存儲引擎層各是什麼作用?
存儲引擎層完成的是數據的存儲和提取;
server完成的是:跨存儲引擎的功能,例如存儲過程。觸發器,視圖。
you have an error in your SQL syntax這個報錯是詞法分析還是語法分析報錯?
語法分析報錯,詞法分析目的是識別出sql裡面的字符串代表什麼,語法分析的目的是識別出sql語句是否滿足mysql語法。
對於表的操作權限驗證是在哪裡進行的?
執行器驗證
執行器的執行查詢語句的流程是什麼樣的?
見下文
為什麼不在優化器前做權限判斷?
因為查詢的表不一定是sql語句,比如觸發器。此時優化器階段並不知道,只能在執行階段知道。
一個select查詢語句的執行流程?
見下文
mysql可以分為server層和存儲引擎層兩部分。
Server層包括:連接器、查詢緩存、分析器、優化器、執行器等,涵蓋了mysql大多數核心服務功能。以及所有內置函數(日期、時間、數學加密函數)。所有跨存儲引擎的功能都在這一層實現,比如 存儲過程、觸發器、視圖。
而存儲引擎層負責數據的存儲和提取,其架構模式是插件式的,支持innoDB、MyISAM、Memory等多個存儲引擎。現在最常用的存儲引擎是InnoDB,它從 MySQL 5.5.5 版本開始成為了默認存儲引擎。
第一步:連接器(建立連接、獲取權限、維持和管理連接)
驗證用戶名密碼;
獲取權限列表
第二步:緩存(緩存sql結果)
Mysql8.0版本直接將查詢緩存整塊功能都刪掉了。因為查詢緩存失效非常頻繁,只有有對一個表的更新操作,那麼這個表所有緩存都會被清空。故在高版本,刪除了緩存的功能。
第三步:分析器(對sql進行詞法分析、語法分析、語義分析)
如果沒有命中查詢緩存,就要開始真正執行語句了。
分析器首先會進行sql解析,分為如下幾個步驟:
1. 詞法分析:需要識別出sql裡面的字符串分別是什麼,代表什麼?
例如select * from t where ID=10
mysql將select關鍵字識別出來,這是一個查詢語句;
mysql將字符串t識別成表名t;
mysql將字符串id識別成列id
2. 語法分析:判斷sql語句是否滿足mysql語法
語法分析主要是分析輸入的sql語法合不合法。分析select、from、where是否複合語法。
如果將select打成slect,那麼這個階段會拋出You have an error in your SQL syntax;
3. 語義分析:對sql中的表,欄位屬性等內容進行檢查是否存在
例如:對資料庫不存在的列「id」,會拋出不存在列的錯誤,這是分析器在語義分析拋出來的。
第四步:優化器(執行方案選擇和索引策略選擇)
經過分析器分析之後,mysql就知道你要做什麼。
當有多種索引、有多種執行方案可以執行時,優化器就會考慮選擇走什麼索引(或者不走索引),走哪種執行方案,效率會更高。總的來說:優化sql語句的執行,最終生成執行計劃。
第五步:執行器(調用存儲引擎接口獲取記錄並返回給客戶端)
分析器知道了你要做什麼,優化器知道了該怎麼做,執行器就開始執行:
判斷用戶「對表t」有沒有查詢權限(剛開始建立連接已經查出所有權限),沒有權限報錯,有則進入下一步;
有權限就會打開表繼續執行,執行器會根據表的引擎定義,去使用這個引擎提供的接口。
調用InnoDB引擎接口,判斷這一行id是不是10,如果不是跳過,如果是則將這行存在結果集中。
調用引擎接口取「下一行」,重複相同的判斷邏輯,直至取到最後一行。
執行器將上述遍歷過程中所有滿足條件的行組成結果集,並且返回給客戶端。
長按下方二維碼↓↓↓
回復 527252免費獲取