第一章《一條查詢語句是怎麼執行的》
第一章《一條查詢語句是怎麼執行的》
Mysql內部是怎麼執行的
這一章的重點就是這一張圖,我們從一個外層使用者的角度來窺探一下Mysql的內幕。
聯結器
首先,我們知道不同系統之間的通訊,就離不開網路,所以一定要有一個Server端去處理這些網路請求。在這裡Mysql去客戶端溝通的就是聯結器。
看到這個我不由的想起來了在Api閘道器中負責網路處理部分的Netty服務的,它同樣也是做了管理HTTP請求、許可權驗證這樣的功能。在這裡我可以認為他就是Mysql這個系統的閘道器。
查詢快取
查詢快取,我看過很多教程,他們都將它稱之為“雞肋”;食之無味棄之可惜。為什麼呢?
因為當一個表進行了一次修改了以後,它表內所有的快取都將被清理掉。可以說可能查詢快取帶來的便利還不及我們花費的維護它的付出。所以順理成章地在Mysql8.0以後查詢快取就不復存在。
分析器
要知道,我們寫出來的SQL並不是它最終的樣子,比如我們可能有很多的符號啊變數啊,要把它分析成它真正的樣子,比如字串id它其實是某一列id,賦予他真正的含義。同時在這個過程中,會進行判錯,如果這一個字串在我們的表中沒有,或者我們的sql語義不對,他就會進行報錯。
這裡我很快聯想到了JVM的類載入階段的連線階段中的解析,同樣也是需要把符號引用轉為直接引用,這裡也是同理,把代表著某列的字串轉為真實的某列。
優化器
我們寫的SQL語句,它最終將如何執行這是不確定的,優化器就是來判斷著去找一條它認為最優的方案,具體為我要使用什麼哪個索引,我join的時候哪個表要作為驅動表,諸如此類。
但是有些時候優化器的判斷也會出錯,它並不一定能給我們最優解。所以我們有時仍需要自主設定索引force index().
執行器
分析器告訴了執行器需要做的事,優化器告訴了執行器該怎麼去做,那執行器當仁不讓,去做自己要做的事了。
另外在做之前還要判斷一下,我能不能有進行這個操作的許可權。
儲存引擎
儲存引擎是可插拔的,例如Memory,Innodb。當然我們常用的就是Innodb,他是以B+樹為索引,用頁的方式去儲存資料。
同時這也意味著,Mysql服務端提供的操作和儲存引擎是相互隔離的。
總結
第一章從Mysql全域性出發,瞭解了我們寫的一條sql語句,它在mysql中會經歷什麼。