最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Mysql之SQL執(zhí)行流程全面解析

 更新時間:2024年12月25日 10:53:06   作者:明礬java  
MySQL的執(zhí)行流程包括查詢緩存、解析器、優(yōu)化器和執(zhí)行器,首先,查詢緩存檢查是否存在查詢結果,如果存在則直接返回;如果不存在,則進入解析器進行語法和語義分析,解析器將SQL語句轉換為語法樹,并進行詞法和語法分析,接著,優(yōu)化器確定最佳執(zhí)行路徑

執(zhí)行流程圖解

查詢緩存

Server 如果在查詢緩存中發(fā)現了這條 SQL 語句,就會直接將結果返回給客戶端;如果沒 有,就進入到解析器階段。

需要說明的是,因為查詢緩存往往效率不高,所以在 MySQL8.0 之后就拋棄了這個功能。

解析器

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

如果沒有命中查詢緩存,就要開始真正執(zhí)行語句了。首先,MySQL需要知道你要做什么,因此需要對SQL語句做解析。SQL語句的分析分為詞法分析與語法分析。

  • 分析器先做“ 詞法分析 ”。你輸入的是由多個字符串和空格組成的一條 SQL 語句,MySQL 需要識別出里面 的字符串分別是什么,代表什么。MySQL 從輸入的"select"這個關鍵字識別出來,這是一個查詢語 句。它也要把字符串“T”識別成“表名 T”,把字符串“ID”識別成“列 ID”。
  • 接著,要做“ 語法分析 ”。根據詞法分析的結果,語法分析器(比如:Bison)會根據語法規(guī)則,判斷你輸入的這個 SQL 語句是否 滿足 MySQL 語法 。

經過詞法分析和語法分析之后的sql語句是正常的話,會生成一個語法樹

下圖是SQL分詞分析的過程步驟:

優(yōu)化器

在優(yōu)化器中會確定 SQL 語句的執(zhí)行路徑,比如是根據 全表檢索 ,還是根據 索引檢索 等。

  • 經過解釋器,MySQL就知道你要做什么了。在開始執(zhí)行之前,還要先經過優(yōu)化器的處理。
  • 一條查詢可以有很多種執(zhí)行方式,最后都返回相同的結果。優(yōu)化器的作用就是找到這其中最好的執(zhí)行計劃。
  • 比如:優(yōu)化器是在表里面有多個索引的時候,決定使用哪個索引;或者在一個語句有多表關聯 (join) 的時候,決定各個表的連接順序,還有表達式簡化、子查詢轉為連接、外連接轉為內連接等

優(yōu)化舉例

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。

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

優(yōu)化器的兩個階段

  1. 邏輯查詢優(yōu)化就是通過改變SQL語句的內容來使得SQL查詢更高效,同時為物理查詢優(yōu)化提供更多的候選執(zhí)行計劃。通常采用的方式是對SQL語句進行等價變換,對查詢進行重寫,而查詢重寫的數學基礎就是關系代數。對條件表達式進行等價謂詞重寫、條件簡化,對視圖進行重寫,對子查詢進行優(yōu)化,對連接語義進行了外連接消除、嵌套連接消除等。
  2. 物理查詢優(yōu)化是基于關系代數進行的查詢重寫,而關系代數的每一步都對應著物理計算,這些物理計算往往存在多種算法,因此需要計算各種物理路徑的代價,從中選擇代價最小的作為執(zhí)行計劃。在這個階段里,對于單表和多表連接的操作,需要高效地使用索引,提升查詢效率。

執(zhí)行器

經過前面三個步驟,只是生成了sql的執(zhí)行計劃,由執(zhí)行器來執(zhí)行該sql的執(zhí)行計劃,在執(zhí)行之前需要判斷該用戶是否 具備權限 。

如果沒有,就會返回權限錯誤。如果具備權限,就執(zhí)行 SQL 查詢并返回結果。

在 MySQL8.0 以下的版本,如果設置了查詢緩存,這時會將查詢結果進行緩存。

比如根據id查詢,并沒有設置索引的話

調用 InnoDB 引擎接口取這個表的第一行,判斷 ID 值是不是1,如果不是則跳過,如果是則將這行存在結果集中;調用引擎接口取“下一行”,重復相同的判斷邏輯,直到取到這個表的最后一行。執(zhí)行器將上述遍歷過程中所有滿足條件的行組成的記錄集作為結果集返回給客戶端。即進行全表掃描遍歷,獲取出所有符合條件的結果

執(zhí)行流程總結

SQL 語句在 MySQL 中的流程是: SQL語句查詢緩存解析器優(yōu)化器執(zhí)行器 。

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

最新評論

龙江县| 大石桥市| 花莲县| 宜兰市| 永吉县| 峡江县| 武威市| 饶河县| 大洼县| 灌云县| 林西县| 航空| 班玛县| 西吉县| 吉隆县| 镇安县| 延庆县| 五峰| 昔阳县| 汉中市| 晴隆县| 古丈县| 湖北省| 桂阳县| 凌海市| 壤塘县| 张家界市| 利辛县| 和林格尔县| 德昌县| 张家港市| 互助| 高要市| 玉田县| 双牌县| 湘西| 龙口市| 共和县| 田东县| 泽州县| 枞阳县|