一條Select的自述!這不就是「你」的一輩子嗎!



原由mysql


你們好,我是一條SQL,你們常常用我來作增刪改查,有一次,我聽面試官問一個面試者,你知道sql語句執行的過程嗎?

答:先寫一條SQL語句,而後鏈接到服務端,服務端執行SQL,返回結果給咱們。

最後,這個面試官讓他回家等通知了。

其實,爲了返回一條數據給業務,我作了不少事情,我先來帶你們認識一下個人組成吧。

通常從總體來講MySQL分爲Server層和存儲引擎層。

Server層,這一層的是跨引擎的,像存儲過程、觸發器、視圖等。


存儲引擎層,從名字能夠聽出來,沒錯,就是存取數據的。固然它的分類也是不少滴,下圖展現部分,還有更多的引擎,可是不經常使用。


還有一些其餘隊的存儲引擎就不一一列舉了,通常來講咱們聽過比較多的有InnoDB、MEMORY、MyISAM,InnoDB最經常使用。當你不指定時,默認引擎就是InnoDB,固然若是須要指定,直接命令來指定,例如: ENGINE = 引擎名稱。

    
 CREATE TABLE TABLE_NAME
(
...
ENGINE=INNODB

到了關鍵環節了,你們不是很關心個人工做流程問題嘛,下面一張圖,就是個人工做時要作的一些事情,還很多吧。

mysql執行圖

首先,要先執行我,須要先鏈接的數據庫,我會先走鏈接器,驗證好帳號密碼正確後,我就能夠去緩存區看是否是存在的,若是緩存裏面有,那我工做量就少了,若是我有權限的話就會把結果直接給客戶端。

若是緩存查不到,我就會去分析器了,在這裏對我進行詞法分析,若是不符合SQL的詞法,就會返回錯誤。

經過詞法驗證後,接下來就會對我作語法分析,不符合要求,直接返回錯誤。符合要求,我被解析成語法解析樹。

接下來就要進入優化器了,優化器會根據本身的判斷,來作決定如何優化,好比如何選擇索引或者聯表查詢時先去查哪一個表。因此,有的時候即便程序員指定了一些索引,我依然不會用,我表示我有本身的想法

而後我帶着優化方案,走向執行器,先讓人看看我有沒有這個權限執行,檢查完事,執行器就會調用對應的引擎接口,依次的把符合條件的數據裝進結果集。同時,還會把結果存到緩存中,最後把結果集返回客戶端就完事了。

你們能夠結合圖,看一下,整體下來仍是挺簡單的。

參考

官網  https://www.mysql.com/cn
《深刻淺出MySQL》
拉鉤 《高性能MySQL實戰》
極客時間 《MySQL實戰45講》

最後

很早前寫的草稿,一直沒發,今天發出來,若有不足,請你們賜教。和小夥伴們一塊兒學習, 持續更新中。。。

另外,mysql執行圖弄了15種樣式,若是你們想看一個本身以爲比較舒服的版本,能夠加小編的微信來要圖。

 
    
    
     
     
              
     
 
    

加我微信回覆"mysql執行圖"便可

程序員

1.  面試官問:Spring 爲啥默認把bean設計成單例的?web

2.  危險!80% 用戶正在考慮放棄 Oracle JDK…面試

3.  面試官問:Mybatis 框架下 SQL 注入攻擊的 3 種方式sql

4. 再見 count(*)數據庫

5. 工做發狂:Mybatis 中$和#千萬不要亂用!緩存

 
    
    
     
     
              
     
 
    


    
原創不易,在看吧!

本文分享自微信公衆號 - Java面試進化論(AuditionEvolution)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。微信

相關文章
相關標籤/搜索