mysql 語句執行的過程

2022-09-16 01:24:15 字數 1845 閱讀 6109

實際上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語句執行過程

查詢語句 許可權校驗 快取查詢 分析器 優化器 執行器 許可權校驗 執行器 引擎。更新語句 分析器 許可權校驗 執行器 引擎 redolog prepare binlog redolog commit。mysql主要分為2部分 server層和儲存引擎層。查詢快取 執行查詢語句的時候,會先查詢快取 ...

MySQL語句執行過程

目錄平常我們看到的只是一條語句執行出來的結果,並不知道中間發生了什麼,今天就來 一下,mysql語句的執行過程。每次使用mysql會先連線到資料庫上面,聯結器負責跟客戶端進行連線 mysql u root p然後根據密碼,判斷我登陸進去會有什麼許可權,並分配許可權給我 通過show processl...

mysql的語句執行過程 Mysql語句執行過程

昨天老大問了我個問題,說一條 在低層的時候是怎麼執行的,發生了什麼 首先使用者通過各種鏈結連線到我們的 伺服器 但是這些鏈結需要等待伺服器的空閒程序來處理 所以當伺服器接到一條 後會做很多分解動作 首先在快取裡查詢快取中是否有需要的資料表,如果有並且可以用那麼就不執行後面的動作了,直接返回給使用者 ...