1. 程式人生 > 資料庫 >MySQL Select語句是如何執行的

MySQL Select語句是如何執行的

MySQL Select語句是怎麼執行的?

最近在極客時間看丁奇大佬的《MySQL45講》,真心覺得講的不錯,把其中獲得的一些MySQL方向的經驗整理整理分享給大家,有興趣同學可以購買相關課程進行學習。

今天分享的內容是select和update的執行流程。

select的執行過程

話不多說,來個神圖鎮樓(自己畫的)。

MySQL Select語句是如何執行的

首先,我們可以看到,整個select語句包含三個模組,其中客戶端和MySQL兩個部分,MySQL又包含server端和儲存引擎側,server端包含聯結器、查詢快取、分析器、優化器,執行器等多個部分,儲存引擎側同樣包含innodb、Myisam,memory等多種儲存引擎。

每個模組的作用如下:

聯結器:

聯結器的任務是跟客戶端建立連線,查詢許可權,維持和管理連線等等。當我們使用命令列登入時,如果密碼或者賬號錯誤,那麼聯結器會返回給我們Access Deny的報錯,利用正確的賬號密碼登入到MySQL之後,聯結器會查詢當前賬號的登入許可權,之後的所有操作,都是依賴這個許可權進行的。

注意,如果此時我們更改了該賬號的許可權,並不會對已經存在的連線產生影響,而只對新加入的連線產生影響。

如果客戶端連線進入MySQL後,一直沒有進行任何操作,那麼聯結器將會在wait_timeout引數設定的時間後,將該連線斷開。建議在程式中使用長連線,這樣可以減小和客戶端和MySQL建立連線的帶來的效能損耗。

查詢快取:

當客戶端輸入一個SQL之後,如果命中查詢快取,那麼MySQL將會直接返回結果,而不進行下面的一系列分析操作,如果沒有命中,則開始進入分析器---優化器---執行器這個流程。關於查詢快取,還有2點需要注意:

a、MySQL8.0中開始棄用查詢快取,因為查詢快取的命中率一般較低,弊大於利。

b、在高併發場景中,建議將查詢快取關閉,關閉時使用query_cache_type=off或者query_cache_size=0。

c、如果非要使用這個功能,可以將引數query_cache_type設定成DEMAND,這樣,就可以使用select sql_cache * from table這種方式強制使用查詢快取的功能了。

分析器:

如果我們的查詢沒有真正命中查詢快取,那麼就要進入分析器這個環節了,分析器的主要功能是詞法分析和語法分析,其中:

詞法分析指的是根據SQL分析出來select、update、alter、列名、表名、庫名等;

語法分析是指需要分析你寫的SQL是否滿足MySQL的語法。如果不滿足,則會給出you have an error xxx的提示。

優化器:

優化器的作用是選出SQL執行的最佳路徑,例如在多表join的時候,優化器會選擇最高效的方案來執行連線查詢。這裡可以給出一個例子,例如我們建立了(a,b)的聯合索引,

select * from table where a=1 and b=1;

select * from table where b=1 and a=1;

這兩條SQL是等價的,因為優化器會將下面的改造成上面的樣子,從而應用聯合索引進行搜尋查詢。

執行器:

SQL經過優化器之後,就會進入執行器,執行SQL前,需要校驗表的許可權,如果有許可權,會根據表的儲存引擎定義,去使用這個儲存引擎提供的介面,最終將資料返回給客戶端,並開始等待新的連線。

這裡需要注意一點:執行器呼叫一次,在引擎內部則掃描了多行,因此儲存引擎掃描行數跟rows_examined並不是完全相同的。

Q && A

Q1:為什麼對許可權的檢查不在優化器之前做?

A1:有些時候,SQL語句要操作的表不只是SQL字面上那些。比如如果有個觸發器,得在執行器階段(過程中)才能確定。優化器階段前是無能為力的

Q2:MySQL許可權到底在哪裡驗證?

A2:賬號的登入許可權在聯結器模組驗證;表的操作許可權分為兩種情況,如果命中查詢快取,會在查詢快取放回結果的時候驗證,在優化器之前,如果沒有命中索引,則許可權驗證在執行器模組驗證。

以上就是MySQL Select語句是如何執行的的詳細內容,更多關於MySQL Select語句的資料請關注我們其它相關文章!