SQL基礎筆記(2) 執行過程

2021-10-01 06:57:41 字數 1610 閱讀 2190

筆記的部分內容來自於極客時間的《sql必知必會》

下面聊聊sql的執行過程,分oracle和mysql。dbms的原理大致一樣,但有些許區別。

sql 語句在 oracle 中經歷了以下的幾個步驟。

語法檢查:檢查 sql 拼寫是否正確,如果不正確,oracle 會報語法錯誤。

語義檢查:檢查 sql 中的訪問物件是否存在。比如我們在寫 select 語句的時候,列名寫錯了,系統就會提示錯誤。語法檢查和語義檢查的作用是保證 sql 語句沒有錯誤。

許可權檢查:看使用者是否具備訪問該資料的許可權。

共享池檢查:共享池(shared pool)是一塊記憶體池,最主要的作用是快取 sql 語句和該語句的執行計畫。oracle 通過檢查共享池是否存在 sql 語句的執行計畫,來判斷進行軟解析,還是硬解析。那軟解析和硬解析又該怎麼理解呢?

在共享池中,oracle 首先對 sql 語句進行 hash 運算,然後根據 hash 值在庫快取(library cache)中查詢,如果存在 sql 語句的執行計畫,就直接拿來執行,直接進入「執行器」的環節,這就是軟解析。

如果沒有找到 sql 語句和執行計畫,oracle 就需要建立解析樹進行解析,生成執行計畫,進入「優化器」這個步驟,這就是硬解析。

優化器:優化器中就是要進行硬解析,也就是決定怎麼做,比如建立解析樹,生成執行計畫。

執行器:當有了解析樹和執行計畫之後,就知道了 sql 該怎麼被執行,這樣就可以在執行器中執行語句了。

mysql 是典型的 c/s 架構,即 client/server 架構,整體的 mysql 流程如下圖:

sql層的執行過程

查詢快取:server 如果在查詢快取中發現了這條 sql 語句,就會直接將結果返回給客戶端;如果沒有,就進入到解析器階段。需要說明的是,因為查詢快取往往效率不高,所以在 mysql8.0 之後就拋棄了這個功能。

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

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

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

mysql 和 oracle 執行 sql 的原理大致是一樣的。

與 oracle 不同的是,mysql 的儲存引擎採用了外掛程式的形式,每個儲存引擎都面向一種特定的資料庫應用環境,只簡說兩種引擎。

innodb 儲存引擎:它是 mysql 5.5 版本之後預設的儲存引擎,最大的特點是支援事務、行級鎖定、外來鍵約束等。

myisam 儲存引擎:在 mysql 5.5 版本之前是預設的儲存引擎,不支援事務,也不支援外來鍵,最大的特點是速度快,占用資源少。

mysql 中每個表的設計都可以採用不同的儲存引擎

sql執行過程

程式中寫的一條sql傳送到伺服器端 查詢此條sql是否存在執行計畫 如果存在則直接呼叫已經編譯好的執行計畫 否則進入下一步。如果sql計畫快取中沒有對應的執行計畫,則進行語法校驗 檢視是否存在語法錯誤 如果語法沒有錯誤則進行語義校驗,例如,表名,列名,儲存過程等等資料庫物件是否真正存在 如果語義沒有...

SQL執行過程

mysql server pluggable storage engines 1 客戶端 服務端通訊協議 查詢快取,如果有資料返回,否則繼續 複製 2 解析器根據解析樹解析 預處理器檢測正常繼續,否則報錯 比如要查詢的字段不存在 複製 3 查詢優化器 explain查詢執行計畫 好比以前我們除錯介面...

sql執行過程分析

我們總是寫sql語句,資料庫把結果返回給我們,那中間過程又是什麼?如果了解oracle是怎麼執行sql語句的中間過程,對我們優化sql有很大的幫助 首先了解一下執行sql,需要消耗什麼資源,cpu,記憶體,io,我們要了解什麼情況下會消耗cpu,什麼情況下消耗記憶體,什麼情況下消耗io,只有了解了這...