一篇文章搞懂SQL在Oracle和MySQL中是如何執行的

Oracle中的SQL是如何執行的

首先來看一看SQL在Oracle中的執行過程

在這裏插入圖片描述
SQL的執行經歷了以下的步驟:

  1. 語法檢查:檢查SQL的拼寫是否正確,如果不正確會報錯
  2. 語義檢查:檢查SQL中的訪問對象是否存在,比如我們查詢的時候,查詢列 'username',但是不小心寫成了'usernames',列名寫錯了,系統就會提示錯誤
  3. 權限檢查:檢查當前用戶是否擁有對該數據的權限
  4. 共享池檢查:共享池(Shared Pool) 是一塊內存池,主要作用是緩存SQL語句和該語句的執行計劃。Oracle通過檢查共享池是否存在SQL語句的執行計劃來判斷使用軟解析還是硬解析
    • 如果存在SQL語句的執行計劃,就直接拿來執行,進入執行器環節,這就是軟解析
    • 如果不存在SQL語句的執行計劃,生成執行計劃,進入優化器步驟,這就是硬解析
  5. 優化器:用來進行硬解析,決定應該怎麼做,如創建解析樹,生成執行計劃等
  6. 執行器:當有了解析樹和執行計劃後,就知道SQL怎麼執行了,就可以執行SQL

Oracle中應該多使用硬解析還是軟解析呢?

在Oracle中,可以使用綁定變量的方式實現軟解析。

綁定變量:

  • 優點:提升了軟解析的可能性,減少硬解析,較少Oracle的工作量
  • 缺點:參數不同導致執行效率不同,優化比較難做,可能會導致生成的執行計劃不夠優化

所以,是否需要綁定變量還需要視情況而定

舉個栗子:

我們需要使用以下查詢語句

SQL> select * from player where player_id = 10001;

如果使用綁定變量就是

SQL> select * from player where player_id = :player_id;

兩個查詢在第一次一次查詢時效率是一致的,但是如果查了10001之後,我們還要繼續查10002等等的值,如果不使用綁定變量,每次都需要創建新的查詢解析,如果使用了綁定變量,在共享池中就存在這類查詢的執行計劃,可以直接調用。

總結:

  • 當查詢較靈活,重複查詢不多時不使用綁定變量進行查詢(儘量多使用硬解析)
  • 當查詢較單一,重複查詢較多時使用綁定變量進行查詢(儘量多使用軟解析)

MySQL中的SQL是如何執行的

首先我們來了解下MySQL的架構,MySQL差用的是C/S架構,服務器端程序使用的是mysqld,執行流程如圖:

在這裏插入圖片描述

MySQL由三成組成:

  • 連接層:客戶端與服務器端建立連接,客戶端發送SQL到服務器端
  • SQL層:對SQL語句進行查詢處理
  • 存儲引擎層:與數據庫打交道,真正的負責數據的存儲和讀取

SQL層的結構:
在這裏插入圖片描述
SQL層與數據庫文件使用哪種存儲引擎無關,是一種通用的處理。執行流程如下:

  1. 查詢緩存:如果查詢緩存發現這句SQL語句,就會直接將結果返回給客戶端,如果沒有,就進入到解析器環節(MySQL8.0之後就拋棄了查詢緩存這個功能了)
  2. 解析器:對SQL語句進行語法分析,語義分析
  3. 優化器:在優化器中確定SQL語句的執行路徑,如:是根據全表檢索還是根據索引進行檢索
  4. 執行器:在執行前需要判斷該用戶是否具備權限。如果具備權限就執行SQL返回結果,(在MySQL8.0之前如果設置了查詢緩存,這是會將查詢結果進行緩存)

MySQL與Oracle執行的區別

MySQL的存儲引擎採用插件的形式,每個存儲引擎都面對一種特定的數據庫應用環境,每一張表都可以設置自己的存儲引擎。常見的存儲引擎:

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

本文參考了:《SQL必知必會》


更多Java面試複習筆記和總結可訪問我的面試複習專欄《Java面試複習筆記》,或者訪問我另一篇博客《Java面試核心知識點彙總》查看目錄和直達鏈接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章