SQL語句的執(zhí)行流程語法分析
一、執(zhí)行流程
| 階段 | 主要功能 | 關(guān)鍵組件 |
|---|---|---|
| 1. 建立連接 | 身份驗(yàn)證、權(quán)限檢查 | 連接器 |
| 2. 預(yù)處理器 | 緩存檢查、SQL預(yù)處理 | 查詢緩存 |
| 3. 解析器 | 詞法分析、語法分析、語義檢查 | 解析器 |
| 4. 優(yōu)化器 | 生成最優(yōu)執(zhí)行計(jì)劃 | 查詢優(yōu)化器 |
| 5. 執(zhí)行器 | 按計(jì)劃執(zhí)行查詢 | 執(zhí)行引擎 |
| 6. 返回?cái)?shù)據(jù) | 結(jié)果返回、資源清理 | 結(jié)果處理器 |
二、建立連接
當(dāng)應(yīng)用程序需要執(zhí)行SQL語句時(shí),首先需要與數(shù)據(jù)庫服務(wù)器建立連接:
# 建立MySQL連接 mysql -h localhost -u username -p database_name
連接階段的主要工作:身份驗(yàn)證和分配連接資源。
三、預(yù)處理器
預(yù)處理器主要負(fù)責(zé)SQL語句的預(yù)處理工作:
- 在MySQL 8.0之前的版本中,預(yù)處理器首先檢查查詢緩存。
- 讀取到這條SQL語句的基本信息。
- 去除注釋和多余空格,大小寫標(biāo)準(zhǔn)化。
四、解析器
分析器負(fù)責(zé)對(duì)SQL語句進(jìn)行全面的分析和檢查:
4.1 詞法分析
將SQL語句分解為一系列的標(biāo)記:
SELECT name, age FROM users WHERE age > 18;
詞法分析結(jié)果:
| 標(biāo)記 | 類型 | 說明 |
|---|---|---|
SELECT | 關(guān)鍵字 | SQL關(guān)鍵字 |
name | 標(biāo)識(shí)符 | 字段名 |
, | 分隔符 | 逗號(hào)分隔符 |
age | 標(biāo)識(shí)符 | 字段名 |
FROM | 關(guān)鍵字 | SQL關(guān)鍵字 |
users | 標(biāo)識(shí)符 | 表名 |
WHERE | 關(guān)鍵字 | SQL關(guān)鍵字 |
> | 操作符 | 比較操作符 |
18 | 數(shù)值常量 | 整數(shù)字面量 |
4.2 語法分析
根據(jù)SQL語法規(guī)則構(gòu)建抽象語法樹(AST):
SELECT
/ \
字段列表 FROM子句
/ \ |
name age users表
|
WHERE子句
|
條件表達(dá)式
/ | \
age > 184.3 語義分析
進(jìn)行語義層面的檢查和驗(yàn)證:
- 表存在性檢查:查詢表信息是回去數(shù)據(jù)庫查詢是否有這個(gè)表。
- 字段存在性檢查:查詢字段信息是回去數(shù)據(jù)庫表查詢是否有這個(gè)字段。
- 權(quán)限檢查:設(shè)計(jì)表或數(shù)據(jù)庫的刪除要檢查當(dāng)前用戶的權(quán)限。
- 約束檢查:查詢表的主外鍵、不為空、唯一等約束條件。
五、優(yōu)化器
選擇代價(jià)最小的執(zhí)行計(jì)劃,從而提高 SQL 執(zhí)行效率,場見的優(yōu)化場景如下:
- 確定多表連接順序
- 是否使用索引?使用哪個(gè)索引?
- 選擇合適的執(zhí)行算法(嵌套循環(huán) / 哈希連接 / 排序 / 歸并等)
示例SQL:
SELECT name FROM student WHERE age > 18;
執(zhí)行器的執(zhí)行過程可能如下:
- 使用 B+ 樹索引快速定位滿足 age > 18 的主鍵 ID;
- 根據(jù)主鍵回表獲取 name 字段;
- 逐行拼裝結(jié)果集并返回給客戶端。
六、執(zhí)行器
根據(jù)執(zhí)行計(jì)劃,具體執(zhí)行 SQL。
步驟:
- 訪問表、索引,執(zhí)行 WHERE 條件過濾
- 做連接操作、聚合、排序等
- 將結(jié)果寫入結(jié)果集返回客戶端
七、返回結(jié)果
查詢執(zhí)行完成后,將結(jié)果返回給客戶端。
比如下面的 SQL:
SELECT id, name FROM user LIMIT 2;
結(jié)果集在返回客戶端前,格式如下:
+----+--------+ | id | name | +----+--------+ | 1 | Alice | | 2 | Bob | +----+--------+
到此這篇關(guān)于SQL語句的執(zhí)行流程的文章就介紹到這了,更多相關(guān)SQL語句的執(zhí)行流程內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 一文詳解如何配置MyBatis實(shí)現(xiàn)打印可執(zhí)行的SQL語句
- C# SqlSugar批量執(zhí)行SQL語句及批量更新實(shí)體對(duì)象的操作方法
- 如何獲取MyBatis Plus執(zhí)行的完整的SQL語句
- MySql一條查詢語句的執(zhí)行流程究竟是怎么樣的
- 解決mybatis plus報(bào)錯(cuò)com.microsoft.sqlserver.jdbc.SQLServerException:必須執(zhí)行該語句才能獲得結(jié)果
- MyBatis中執(zhí)行SQL語句的幾種方式總結(jié)
- mybatis中如何實(shí)現(xiàn)一個(gè)標(biāo)簽執(zhí)行多個(gè)sql語句
- Oracle查看正在執(zhí)行的sql語句的方法大全
- 圖文詳解Mysql使用left?join寫查詢語句執(zhí)行很慢問題的解決
相關(guān)文章
SQL Server簡單實(shí)現(xiàn)數(shù)據(jù)的日?qǐng)?bào)和月報(bào)功能
這篇文章主要介紹了SQL Server簡單實(shí)現(xiàn)數(shù)據(jù)的日?qǐng)?bào)和月報(bào)功能,結(jié)合實(shí)例形式對(duì)比分析了SQL Server實(shí)現(xiàn)當(dāng)日及當(dāng)月數(shù)據(jù)的查詢功能相關(guān)技巧,需要的朋友可以參考下2016-06-06
SQL Server 不存在或訪問被拒絕(轉(zhuǎn))
在使用 SQL Server 的過程中,用戶遇到最多的問題莫過于連接失敗了。一般而言,有兩種連接SQL Server 的方式,一是利用 SQL Server 自帶的客戶端工具2009-06-06
sql分組后二次匯總(處理表重復(fù)記錄查詢和刪除)的實(shí)現(xiàn)方法
這篇文章主要介紹了sql分組后二次匯總的實(shí)現(xiàn)方法,需要的朋友可以參考下2017-02-02
調(diào)整SQLServer2000運(yùn)行中數(shù)據(jù)庫結(jié)構(gòu)
這篇文章主要介紹了調(diào)整SQLServer2000運(yùn)行中數(shù)據(jù)庫結(jié)構(gòu),十分實(shí)用的一個(gè)功能,這里推薦給大家,有需要的小伙伴可以參考下。2015-04-04
sqlserver利用存儲(chǔ)過程去除重復(fù)行的sql語句
以前弄過類似,去除相同信息的方法,現(xiàn)在找不到了,不過今天又花一些時(shí)間給弄出來了,記錄一下2010-06-06
sqlserver 批量刪除存儲(chǔ)過程和批量修改存儲(chǔ)過程的語句
sqlserver 批量刪除存儲(chǔ)過程和批量修改存儲(chǔ)過程的語句,需要的朋友可以參考下。2011-07-07
MSSQL附加數(shù)據(jù)庫拒絕訪問提示5120錯(cuò)誤的處理方法
這篇文章主要介紹了MSSQL附加數(shù)據(jù)庫拒絕訪問提示5120錯(cuò)誤的處理方法,需要的朋友可以參考下2014-07-07
MS SQL Server排查多列之間的值是否重復(fù)的功能實(shí)現(xiàn)
在日常的應(yīng)用中,排查列重復(fù)記錄是經(jīng)常遇到的一個(gè)問題,但某些需求下,需要我們排查一組列之間是否有重復(fù)值的情況,本文給大家介紹了MS SQL Server排查多列之間的值是否重復(fù)的功能實(shí)現(xiàn),需要的朋友可以參考下2024-09-09
SQLServer數(shù)據(jù)庫游標(biāo)的具體使用
本文主要介紹了SQLServer數(shù)據(jù)庫游標(biāo)的具體使用,游標(biāo)通常用于需要逐行處理數(shù)據(jù)的情況,例如對(duì)每一行數(shù)據(jù)進(jìn)行特定的計(jì)算或更新操作,下面就一起來了解一下2024-08-08

