SQL執行流程

2022-09-19 13:09:14 字數 1832 閱讀 7266

mysql的查詢流程:

1、查詢快取:server如果在查詢快取中發現了這條sql語句,就會直接將結果返回給客戶端;如果沒有,就進入到解析器階段。需要說明的是,因為查詢快取往往效率不高,所以在mysql8.0以後就拋棄了這個功能(兩個sql需要完全一樣,包括空格、注釋、大小寫都必須一樣)

2、解析器:在解析器中對sql語句進行語法分析、語義分析

3、優化器:在優化器中會確定sql語句的執行路徑,比如是根據全表檢索,還是根據索引檢索等。

一條查詢可以有很多種執行方式,最後都返回相同的結果。優化器的作用就是找到這其中最好的執行計畫。

比如:優化器是在表裡面有多個索引的時候,決定使用哪個索引;或者在乙個語句有奪標關聯(join)的時候,決定各個表的連線順序,還有表示式簡化、子查詢轉為連線、外連線轉為內連線等。

舉例:如下語句是執行兩個表的join:

select * from test1 join test2 using(id) where test1.name='zhangwei' and test2.name='mysql';
方案1:可以先從表test1裡取出name='zhangwei'的記錄的id值,再根據id值關聯到表test2,再判斷test2立馬name的值是否等於'mysql'。

方案2:可以先從表test2裡面取出name='mysql'的記錄的id值,再根據id值關聯到test1,再判斷test1裡面name的值是否等於'zhangwei'。

這兩種執行方法的邏輯結果是一樣的,但是執行的效率會有不同,而優化器的作用就是決定選擇使用哪乙個方案。優化器階段完成後,這個語句的執行方案就確定下來了,然後進入執行器階段。

在查詢優化器中,可以分為邏輯查詢優化階段和物理查詢優化階段。

邏輯查詢優化就是通過改變sql語句的內容來使得sql查詢更高效,同時為物理查詢優化提供更多的候選執行計畫。通常採用的方式是對sql語句進行等價變換,對查詢進行重寫,而查詢重寫的數學基礎就是關係代數。對條件表示式進行等價謂詞重寫、條件簡化,對檢視進行重寫,對子查詢進行優化,對連線語義進行了外連線消除、巢狀連線消除等。

物理查詢優化是基於關係代數進行的查詢重寫,而關係代數的每一步都對應著物理計算,這些物理計算往往存在多種演算法,因此需要計算各種物理路徑的代價,從中選擇最小的作為執行計畫。在這個階段裡,對於單錶和多表連線的操作,需要高效的使用索引,提公升查詢效率。

4、執行器

截止到現在,還沒有真正地去讀寫真實的表,只是產出了個執行計畫。於是就進入了執行器階段

在執行之前需要判斷該使用者是否具備許可權。如果沒有,就會返回許可權錯誤。如果具備許可權,就執行sql查詢並返回結果。在mysql8以下的版本,如果設定了查詢快取,這時會將查詢結果進行快取。

如果有許可權,就開啟表繼續執行。開啟表的時候,執行器就會根據表的引擎定義,呼叫儲存引擎api對錶進行讀寫。儲存引擎api只是抽象介面,下面還有個儲存引擎層,具體實現還是要看錶選擇的儲存引擎。

SQL 內部執行流程

1,sql解析 sql處理的第一階段就是sql解析。當應用程式發出sql語句時,該應用程式向資料庫發出乙個解析呼叫,以準備執行該語句,解析呼叫會開啟或建立乙個游標,它是乙個對特定於會話的私有sql區的控制代碼,其中包含了已分析的sql語句和其他處理資訊。游標和私有sql區位於pga中。解析呼叫期間,...

SQL語句執行流程

第一步 客戶端把語句發給伺服器端執行 當我們在客戶端執行sql語句時,客戶端會把這條 sql 語句傳送給伺服器端,讓伺服器端的程序來處理這語句。也就是說,oracle 客戶端是不會做任何的操作,他的主要任務就是把客戶端產生的一些 sql 語句傳送給伺服器端。雖然在客戶端也有乙個資料庫程序但這個程序的...

mysql使用者SQL執行流程

對於dba來說,知道資料庫內部對使用者程序的處理流程是非常重要的,mysql跟oracle都屬於關係型資料庫,在處理使用者的程序方面有著相似之處 這裡我們只討論mysql 第一 連線階段 1 使用者發起sql程序,監聽客戶端的 連線管理模組 在3306埠接收客戶的sql請求 2 將請求 到 連線進 ...