你們好,我是一條SQL,你們常常用我來作增刪改查,有一次,我聽面試官問一個面試者,你知道sql語句執行的過程嗎?
答:先寫一條SQL語句,而後鏈接到服務端,服務端執行SQL,返回結果給咱們。
其實,爲了返回一條數據給業務,我作了不少事情,我先來帶你們認識一下個人組成吧。
通常從總體來講MySQL分爲Server層和存儲引擎層。
Server層,這一層的是跨引擎的,像存儲過程、觸發器、視圖等。
存儲引擎層,從名字能夠聽出來,沒錯,就是存取數據的。固然它的分類也是不少滴,下圖展現部分,還有更多的引擎,可是不經常使用。
還有一些其餘隊的存儲引擎就不一一列舉了,通常來講咱們聽過比較多的有InnoDB、MEMORY、MyISAM,InnoDB最經常使用。當你不指定時,默認引擎就是InnoDB,固然若是須要指定,直接命令來指定,例如: ENGINE = 引擎名稱。
CREATE TABLE TABLE_NAME
(
...
) ENGINE=INNODB
到了關鍵環節了,你們不是很關心個人工做流程問題嘛,下面一張圖,就是個人工做時要作的一些事情,還很多吧。

首先,要先執行我,須要先鏈接的數據庫,我會先走鏈接器,驗證好帳號密碼正確後,我就能夠去緩存區看是否是存在的,若是緩存裏面有,那我工做量就少了,若是我有權限的話就會把結果直接給客戶端。
若是緩存查不到,我就會去分析器了,在這裏對我進行詞法分析,若是不符合SQL的詞法,就會返回錯誤。
經過詞法驗證後,接下來就會對我作語法分析,不符合要求,直接返回錯誤。符合要求,我被解析成語法解析樹。
接下來就要進入優化器了,優化器會根據本身的判斷,來作決定如何優化,好比如何選擇索引或者聯表查詢時先去查哪一個表。因此,有的時候即便程序員指定了一些索引,我依然不會用,我表示我有本身的想法
。
而後我帶着優化方案,走向執行器,先讓人看看我有沒有這個權限執行,檢查完事,執行器就會調用對應的引擎接口,依次的把符合條件的數據裝進結果集。同時,還會把結果存到緩存中,最後把結果集返回客戶端就完事了。
官網 https://www.mysql.com/cn
很早前寫的草稿,一直沒發,今天發出來,若有不足,請你們賜教。和小夥伴們一塊兒學習, 持續更新中。。。
另外,mysql執行圖弄了15種樣式,若是你們想看一個本身以爲比較舒服的版本,能夠加小編的微信來要圖。

加我微信回覆"mysql執行圖"便可
推薦閱讀程序員
1. 面試官問:Spring 爲啥默認把bean設計成單例的?web
2. 危險!80% 用戶正在考慮放棄 Oracle JDK…面試
3. 面試官問:Mybatis 框架下 SQL 注入攻擊的 3 種方式sql
4. 再見 count(*)數據庫
5. 工做發狂:Mybatis 中$和#千萬不要亂用!緩存