欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

執(zhí)行流程圖解

查詢緩存

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

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

解析器

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

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

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

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

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

優(yōu)化器

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

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

優(yōu)化舉例

select * from test1 join test2 using(ID)
where test1.name='zhangwei' and test2.name='mysql高級課程';
  • 方案1:可以先從表 test1 里面取出 name='zhangwei'的記錄的 ID 值,再根據(jù) ID 值關(guān)聯(lián)到表 test2,再判斷 test2 里面 name的值是否等于 'mysql高級課程'。
  • 方案2:可以先從表 test2 里面取出 name='mysql高級課程' 的記錄的 ID 值,再根據(jù) ID 值關(guān)聯(lián)到 test1,再判斷 test1 里面 name的值是否等于 zhangwei。

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

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

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

執(zhí)行器

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

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

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

比如根據(jù)id查詢,并沒有設(shè)置索引的話

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

執(zhí)行流程總結(jié)

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

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

相關(guān)文章

  • 在同一臺機器上運行多個 MySQL 服務(wù)

    在同一臺機器上運行多個 MySQL 服務(wù)

    在同一臺機器上運行多個 MySQL 服務(wù)...
    2006-11-11
  • MySQL中的行級鎖定示例詳解

    MySQL中的行級鎖定示例詳解

    這篇文章主要給大家介紹了關(guān)于MySQL中行級鎖定的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用MySQL具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • mysql8.0.20配合binlog2sql的配置和簡單備份恢復(fù)的步驟詳解

    mysql8.0.20配合binlog2sql的配置和簡單備份恢復(fù)的步驟詳解

    這篇文章主要介紹了mysql8.0.20配合binlog2sql的配置和簡單備份恢復(fù)的步驟,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • Mysql中被鎖住的表查詢以及如何解鎖詳解

    Mysql中被鎖住的表查詢以及如何解鎖詳解

    這篇文章主要介紹了Mysql中被鎖住的表查詢以及如何解鎖的相關(guān)資料,這些方法可以幫助你釋放鎖并恢復(fù)表的正常使用,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2025-03-03
  • ERROR 1524 (HY000): Plugin ‘mysql_native_password‘ is not loaded

    ERROR 1524 (HY000): Plugin ‘mysql_native

    這篇文章主要介紹了ERROR 1524 (HY000): Plugin ‘mysql_native_password‘ is not loaded,本文提供了三種解決方法,具有一定的參考價值,感興趣的可以了解一下
    2025-03-03
  • MySQL中出現(xiàn)lock?wait?timeout?exceeded問題及解決

    MySQL中出現(xiàn)lock?wait?timeout?exceeded問題及解決

    這篇文章主要介紹了MySQL中出現(xiàn)lock?wait?timeout?exceeded問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • MySQL加減間隔時間函數(shù)DATE_ADD和DATE_SUB的實現(xiàn)

    MySQL加減間隔時間函數(shù)DATE_ADD和DATE_SUB的實現(xiàn)

    mysql中內(nèi)置函數(shù)date_add 和 date_sub能對指定的時間進行增加或減少一個指定的時間間隔,本文主要介紹了MySQLDATE_ADD和DATE_SUB的實現(xiàn),感興趣的可以了解一下
    2024-09-09
  • 詳解Mysql中的JSON系列操作函數(shù)

    詳解Mysql中的JSON系列操作函數(shù)

    新版 Mysql 中加入了對 JSON Document 的支持,可以創(chuàng)建 JSON 類型的字段,并有一套函數(shù)支持對JSON的查詢、修改等操作,下面就實際體驗一下
    2016-07-07
  • 聊聊MySQL事務(wù)的特性和隔離級別

    聊聊MySQL事務(wù)的特性和隔離級別

    這篇文章主要介紹了MySQL事務(wù)的特性和隔離級別的相關(guān)資料,幫助大家粗略的認識下MySQL 事務(wù)的相關(guān)知識,感興趣的朋友可以了解下
    2020-09-09
  • MySQL視圖中如何使用IF和CASE語句

    MySQL視圖中如何使用IF和CASE語句

    這篇文章主要介紹了MySQL視圖中如何使用IF和CASE語句問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01

最新評論