一條SQL查詢語句是如何執行的

2022-07-02 06:57:07 字數 2039 閱讀 8823

server層包括聯結器、查詢快取、分析器、優化器、執行器等,涵蓋了mysql的大多數核心服務功能以及所有的內建函式,所有跨儲存引擎的功能都在這一層實現,比如儲存過程、觸發器、檢視等。

而儲存引擎層負責資料的儲存與提取。其架構模式是外掛程式式的,支援innodb、myisam、memory等多個儲存引擎,預設的是innodb。可以在建表的時候使用engine = memory來指定儲存引擎

第一步,你會先連線到這個資料庫上。聯結器負責與客戶端建立連線、獲取許可權、維持和管理連線。在完成經典的tcp握手之後,聯結器就要開始驗證你的身份了。如果使用者名稱或密碼不對,你就會收到「access denied for user錯誤」;如果驗證通過,聯結器會到許可權表中查出你擁有的許可權(這意味著,乙個使用者建立連線後,即使你用管理員賬號對這個使用者許可權修改,也不會影響已經存在連線的許可權)。

在資料庫中,長連線是指連線成功後,如果客戶端持續有請求,則一直使用同乙個連線。短連線則是指每次執行完很少的幾次查詢就斷開連線,下次查詢再新建乙個。因為建立連線的過程通常是比較複雜的,所以建議盡量使用長連線。但是全部使用長連線,有時候mysql占用記憶體漲的特別快,這是因為mysql在執行過程中臨時使用的記憶體是管理在連線物件裡面的。這些資源在連線斷開的時候才釋放。所以如果長連線積累下來,可能導致記憶體占用太大,被系統強行殺掉,從現象來看就算mysql異常重啟

1、定期斷開長鏈結。使用一段時間,或者程式裡面判斷執行過乙個占用記憶體的大查詢後,斷開連線,之後要查詢再重連。

2、可以在每次執行乙個比較大的操作後,通過執行 mysql_reset_connection來重新初始化連線資源。這個過程不需要重連和重新驗證許可權,但是會將連線恢復到剛剛建立完時的狀態。

建立連線之後,mysql拿到乙個查詢請求後,會先到查詢快取中看之前是否執行過這條語句,如果查詢快取命中,則查詢結果返回給客戶端;如果查詢快取不明中,就會繼續後面的執行階段。執行完成後,執行結果會被存入查詢快取中。

如果快取命中,mysql不需要執行後面的複雜操作,就可以直接返回結果,效率很高。但是查詢快取失效非常頻繁,只要有對乙個表的更新,這個表的所有查詢快取都會被清空,因此可能你費力地把結果存起來,還沒使用呢,就被乙個更新全清空了。除非你的業務是一張靜態表,很長時間才會更新一次。

select sql_cache * from t;
注:mysql8.0直接將查詢快取的整塊功能刪掉了。

分析器會先做「詞法分析」。你輸入的是由多個字串和空格組成的一條sql語句,mysql需要識別出裡面的字串分別是什麼,代表什麼。

做完識別之後,就要做語法分析。根據詞法分析的結果,語法分析器會根據語法規則,判斷你輸入的這個sql是否滿足mysql語法。

優化器是在表裡面有多個索引的時候,決定使用哪個索引;或者在乙個語句中有多表關聯的時候,決定各個表的連線順序。優化器階段完成後,這個語句的執行方案就確定下來了,就如執行器階段。

select * from t where id = 10; --id欄位沒有索引
1、呼叫innodb引擎介面取這個表的第一行,判斷id值是不是10,如果不是則跳過,如果是則將這行存在結果集中

2、 呼叫引擎介面取下一行,重複相應的判斷邏輯,直到取到最後一行

3、 執行器將遍歷過程中所有滿足條件的行組成的記錄集作為結果集返回給客戶端。

對於有索引的表,執行邏輯也差不多。第一次呼叫的是「取滿足條件的第一行」這個藉口,之後迴圈取「滿足條件的下一行」這個介面,這些介面都是在引擎中已經定義好的。

一條SQL查詢語句是如何執行的

mysql可以分為server層和儲存引擎層兩部分 一條普通的查詢語是怎樣執行並返回結果了 聯結器查詢快取 大多數情況下建議不要使用查詢快取,查詢快取往往弊大於利。查詢快取的失效非常頻繁,只要有對乙個表的更新,這個表上所有的查詢快取都會被清空。分析器優化器 比如你執行下面這樣的語句,這個語句是執行兩...

一條SQL查詢語句是如何執行的?

我們在寫sql的時候crud這些基本的操作想必大家已經是得心應手了,專欄會更傾向於sql優化與執行過程模型的角度重新學習sql,方便大家在做效能優化上更加熟練。select from t where id 10 接下來我們來拆解一下這個sql語句,從中就可以看出sql在mysql中各個模組的執行過程...

一條SQL查詢語句是如何執行的

大體來說,mysql分為 server 層和儲存引擎層,server 層有聯結器 分析器 優化器 執行器和查詢快取 其中,客戶端發出請求與聯結器建立連線並獲取許可權,分析器對sql語句做分析並判斷是否正確 優化器決定使用哪個索引,生成執行計畫,決定多表連線中表的連線順序。執行器執行語句,操作儲存引擎...