1. 程式人生 > 其它 >第一章《一條查詢語句是怎麼執行的》

第一章《一條查詢語句是怎麼執行的》

第一章《一條查詢語句是怎麼執行的》

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中會經歷什麼。