SQL是如何執行的

Megetood發表於2020-09-23

Oracle 中的 SQL 是如何執行的

在這裡插入圖片描述

  1. 語法檢查:檢查 SQL 拼寫是否正確,如果不正確,Oracle 會報語法錯誤。

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

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

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

    在共享池中,Oracle 首先對 SQL 語句進行 Hash 運算,然後根據 Hash 值在庫快取(Library Cache)中查詢,如果存在 SQL 語句的執行計劃,就直接拿來執行,直接進入“執行器”的環節,這就是軟解析。

    如果沒有找到 SQL 語句和執行計劃,Oracle 就需要建立解析樹進行解析,生成執行計劃,進入“優化器”這個步驟,這就是硬解析。

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

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

MySQL 中的 SQL 是如何執行的

在這裡插入圖片描述

  1. 連線層:客戶端和伺服器端建立連線,客戶端傳送 SQL至伺服器端;
  2. SQL 層:對 SQL 語句進行查詢處理;
  3. 儲存引擎層:與資料庫檔案打交道,負責資料的儲存和讀取。
    在這裡插入圖片描述
  4. 查詢快取:Server 如果在查詢快取中發現了這條 SQL 語句,就會直接將結果返回給客戶端;如果沒有,就進入到解析器階段。需要說明的是,因為查詢快取往往效率不高,所以在 MySQL8.0 之後就拋棄了這個功能。
  5. 解析器:在解析器中對 SQL 語句進行語法分析、語義分析。
  6. 優化器:在優化器中會確定 SQL 語句的執行路徑,比如是根據全表檢索,還是根據索引來檢索等。
  7. 執行器:在執行之前需要判斷該使用者是否具備許可權,如果具備許可權就執行 SQL 查詢並返回結果。在 MySQL8.0 以下的版本,如果設定了查詢快取,這時會將查詢結果進行快取。

與 Oracle 不同的是,MySQL 的儲存引擎採用了外掛的形式,每個儲存引擎都面向一種特定的資料庫應用環境。同時開源的 MySQL 還允許開發人員設定自己的儲存引擎,下面是一些常見的儲存引擎:

  1. InnoDB 儲存引擎:它是 MySQL 5.5 版本之後預設的儲存引擎,最大的特點是支援事務、行級鎖定、外來鍵約束等。
  2. MyISAM 儲存引擎:在 MySQL 5.5 版本之前是預設的儲存引擎,不支援事務,也不支援外來鍵,最大的特點是速度
    快,佔用資源少。
  3. Memory 儲存引擎:使用系統記憶體作為儲存介質,以便得到更快的響應速度。不過如果 mysqld 程式崩潰,則會導致所有的資料丟失,因此我們只有當資料是臨時的情況下才使用 Memory 儲存引擎。
  4. NDB 儲存引擎:也叫做 NDB Cluster 儲存引擎,主要用於 MySQL Cluster 分散式叢集環境,類似於 Oracle 的RAC 叢集。
  5. Archive 儲存引擎:它有很好的壓縮機制,用於檔案歸檔,在請求寫入時會進行壓縮,所以也經常用來做倉庫。

相關文章