mysql中SQL執行過程詳解

2021-08-22 04:55:57 字數 1876 閱讀 9907

mysql執行乙個查詢的過程,到底做了些什麼:

實際上mysql執行的每一步都比較複雜,具體的過程如下:

1、mysql客戶端和伺服器通訊

mysql客戶端和伺服器之間的通訊協議是「半雙工」的,這意味著,在任何乙個時刻,要麼由伺服器向客戶端傳送資料,要麼由客戶端向伺服器傳送資料,這兩個動作不能同時發生。這種協議讓mysql通訊簡單快速,但也限制了mysql。乙個明顯的限制是,這意味著沒辦法進行流量限制。一旦一端開始發生訊息,另一端要接收完整個訊息才能響應他。

客戶端用乙個單獨的資料報將查詢傳給伺服器。一旦客戶端傳送了請求,他能做的事情就只是等待結果了。

相反的,一般伺服器響應給使用者的資料通常很多,由多個資料報組成。當伺服器開始響應客戶端請求時,客戶端必須完整的接受整個返回結果,而不是簡單的只收取前面幾條結果,然後讓伺服器停止傳送資料。

多數連線mysql的庫函式都可以獲得全部結果並快取到記憶體裡,還可以逐行獲取所需要的資料。預設一般是獲得全部結果並快取到記憶體中。mysql通常需要等所有的資料都已經傳送給客戶端才能釋放這條查詢所占用的資源,所以接受全部結果並快取通常可以減少伺服器的壓力,讓查詢能夠早點結束、早點釋放對應的資源。

2、查詢狀態

對於mysql連線,任何時刻都有乙個狀態,該狀態表示了mysql當前正在做什麼。使用show full processlist命令檢視當前狀態。在乙個查詢生命週期中,狀態會變化很多次,下面是這些狀態的解釋:

3、查詢快取

在解析乙個查詢語句之前,如果查詢快取是開啟的,那麼mysql會優先檢查這個查詢是否命中查詢快取中的資料。這個檢查是通過乙個對大小寫敏感的雜湊查詢實現的。查詢和快取中的查詢即使只有乙個位元組不同,那也不會匹配快取結果,這種情況下查詢就會進入下一階段的處理。

如果當前的查詢恰好命中了查詢快取,那麼在返回查詢結果之前mysql會檢查一次使用者許可權。這仍然是無須解析查詢sql語句的,因為在查詢快取中已經存放了當前 查詢需要訪問的表資訊。如果許可權沒有問題,mysql會跳過所有其他階段,直接從快取中拿到結果並返回給客戶端。這種情況下,查詢不會被解析,不用生成執行計畫,不會被執行。

4、查詢優化處理

查詢的生命週期的下一步是將乙個sql轉換成乙個執行計畫,mysql在依照這個執行計畫和儲存引擎進行互動。這包含多個子階段:解析sql、預處理、優化sql執行計畫。這個過程中任何錯誤都可能終止查詢。

5、查詢執行引擎

在解析和優化階段,mysql將生成查詢對應的執行計畫,mysql的查詢執行引擎則根據這個執行計畫來完成整個查詢。這裡執行計畫是乙個資料結構,而不是和很多其他的關係型資料庫那樣對應的位元組碼。

mysql簡單的根據執行計畫給出的指令逐步執行。在根據執行計畫逐步執行的過程中,有大量的操作需要通過呼叫儲存引擎實現的介面來完成。為了執行查詢,mysql只需要重複執行計畫中的各個操作,知道完成所有的資料查詢。

6、返回結果給客戶端

查詢執行的最後乙個階段是將結果返回給客戶端。即使查詢不需要返回結果給客戶端,mysql仍然會返回這個查詢的一些資訊,如該查詢影響到的行數。如果查詢可以被快取,那麼mysql在這個階段也會將結果放到查詢快取中。

mysql將結果集返回客戶端是乙個增量、逐步返回的過程。這樣有兩個好處:伺服器端無須儲存太多的結果,也就不會因為返回太多結果而消耗太多的記憶體;這樣處理也讓msyql客戶端第一時間獲得返回的結果。

結果集中的每一行都會以乙個滿足mysql客戶端/伺服器通訊協議的包傳送,再通過tcp協議進行傳輸,在tcp傳輸的過程中,可能對mysql的封包進行快取然後批量傳輸。

MySQL探秘 SQL語句執行過程詳解

當希望mysql能夠以更高的效能執行查詢時,最好的辦法就是弄清楚mysql是如何優化和執行查詢的。一旦理解了這一點,很多查詢優化工作實際上就是遵循一些原則能夠按照預想的合理的方式執行。如下圖所示,當向mysql傳送乙個請求的時候,mysql到底做了什麼 客戶端傳送一條查詢給伺服器。伺服器先檢查查詢快...

Mysql中sql執行的過程

1 客戶端和伺服器建立連線,傳送請求 2 伺服器先檢查查詢快取。如果在查詢快取中發現了該sql,則會進行許可權校驗,許可權校驗通過,直接返回結果。如果查詢快取中沒有,則進入下面的步驟 對應查詢快取這一過程,8.0這一過程已經不存在了,8.0完全拋棄了這個功能 3 伺服器對sql進行解析。識別出sql...

SQL語句執行過程詳解

當希望mysql能夠以更高的效能執行查詢時,最好的辦法就是弄清楚mysql是如何優化和執行查詢的。一旦理解了這一點,很多查詢優化工作實際上就是遵循一些原則能夠按照預想的合理的方式執行 如下圖所示,當向mysql傳送乙個請求的時候,mysql到底做了什麼 1.客戶端傳送一條查詢給伺服器。2.伺服器先檢...