SQL語句的執(zhí)行流程語法分析
一、執(zhí)行流程
階段 | 主要功能 | 關(guān)鍵組件 |
---|---|---|
1. 建立連接 | 身份驗證、權(quán)限檢查 | 連接器 |
2. 預處理器 | 緩存檢查、SQL預處理 | 查詢緩存 |
3. 解析器 | 詞法分析、語法分析、語義檢查 | 解析器 |
4. 優(yōu)化器 | 生成最優(yōu)執(zhí)行計劃 | 查詢優(yōu)化器 |
5. 執(zhí)行器 | 按計劃執(zhí)行查詢 | 執(zhí)行引擎 |
6. 返回數(shù)據(jù) | 結(jié)果返回、資源清理 | 結(jié)果處理器 |
二、建立連接
當應用程序需要執(zhí)行SQL語句時,首先需要與數(shù)據(jù)庫服務器建立連接:
# 建立MySQL連接 mysql -h localhost -u username -p database_name
連接階段的主要工作:身份驗證和分配連接資源。
三、預處理器
預處理器主要負責SQL語句的預處理工作:
- 在MySQL 8.0之前的版本中,預處理器首先檢查查詢緩存。
- 讀取到這條SQL語句的基本信息。
- 去除注釋和多余空格,大小寫標準化。
四、解析器
分析器負責對SQL語句進行全面的分析和檢查:
4.1 詞法分析
將SQL語句分解為一系列的標記:
SELECT name, age FROM users WHERE age > 18;
詞法分析結(jié)果:
標記 | 類型 | 說明 |
---|---|---|
SELECT | 關(guān)鍵字 | SQL關(guān)鍵字 |
name | 標識符 | 字段名 |
, | 分隔符 | 逗號分隔符 |
age | 標識符 | 字段名 |
FROM | 關(guān)鍵字 | SQL關(guān)鍵字 |
users | 標識符 | 表名 |
WHERE | 關(guān)鍵字 | SQL關(guān)鍵字 |
> | 操作符 | 比較操作符 |
18 | 數(shù)值常量 | 整數(shù)字面量 |
4.2 語法分析
根據(jù)SQL語法規(guī)則構(gòu)建抽象語法樹(AST):
SELECT / \ 字段列表 FROM子句 / \ | name age users表 | WHERE子句 | 條件表達式 / | \ age > 18
4.3 語義分析
進行語義層面的檢查和驗證:
- 表存在性檢查:查詢表信息是回去數(shù)據(jù)庫查詢是否有這個表。
- 字段存在性檢查:查詢字段信息是回去數(shù)據(jù)庫表查詢是否有這個字段。
- 權(quán)限檢查:設計表或數(shù)據(jù)庫的刪除要檢查當前用戶的權(quán)限。
- 約束檢查:查詢表的主外鍵、不為空、唯一等約束條件。
五、優(yōu)化器
選擇代價最小的執(zhí)行計劃,從而提高 SQL 執(zhí)行效率,場見的優(yōu)化場景如下:
- 確定多表連接順序
- 是否使用索引?使用哪個索引?
- 選擇合適的執(zhí)行算法(嵌套循環(huán) / 哈希連接 / 排序 / 歸并等)
示例SQL:
SELECT name FROM student WHERE age > 18;
執(zhí)行器的執(zhí)行過程可能如下:
- 使用 B+ 樹索引快速定位滿足 age > 18 的主鍵 ID;
- 根據(jù)主鍵回表獲取 name 字段;
- 逐行拼裝結(jié)果集并返回給客戶端。
六、執(zhí)行器
根據(jù)執(zhí)行計劃,具體執(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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 一文詳解如何配置MyBatis實現(xiàn)打印可執(zhí)行的SQL語句
- C# SqlSugar批量執(zhí)行SQL語句及批量更新實體對象的操作方法
- 如何獲取MyBatis Plus執(zhí)行的完整的SQL語句
- MySql一條查詢語句的執(zhí)行流程究竟是怎么樣的
- 解決mybatis plus報錯com.microsoft.sqlserver.jdbc.SQLServerException:必須執(zhí)行該語句才能獲得結(jié)果
- MyBatis中執(zhí)行SQL語句的幾種方式總結(jié)
- mybatis中如何實現(xiàn)一個標簽執(zhí)行多個sql語句
- Oracle查看正在執(zhí)行的sql語句的方法大全
- 圖文詳解Mysql使用left?join寫查詢語句執(zhí)行很慢問題的解決
相關(guān)文章
sql中的left join及on、where條件關(guān)鍵字的區(qū)別詳解
LEFT JOIN 關(guān)鍵字從左表(table1)返回所有的行,即使右表(table2)中沒有匹配。如果右表中沒有匹配,則結(jié)果為 NULL。這篇文章主要介紹了sql中的left join以及on、where關(guān)鍵字的區(qū)別,需要的朋友可以參考下2018-08-08MSSQL報錯:參數(shù)數(shù)據(jù)類型 text 對于 replace 函數(shù)的參數(shù) 1 無效的解決辦法
在sql中使用replace函數(shù)可以替換某個字段中的一些內(nèi)容,但是如果字段是text類型那么使用replace函數(shù)就會報“參數(shù)數(shù)據(jù)類型text 對于replace 函數(shù)的參數(shù)1 無效?!?,這個錯誤說明對text或ntext類型的數(shù)據(jù)在查詢中不能進行字符串操作2014-03-03SQL Server 2005 還原數(shù)據(jù)庫錯誤解決方法
解決SQL Server 2005 還原數(shù)據(jù)庫錯誤:System.Data.SqlClient.SqlError: 在對 'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\BusinessDB.mdf' 嘗試 'RestoreContainer::ValidateTargetForCreation' 時,操作系統(tǒng)返回了錯誤 '5(拒絕訪問)'2009-03-03SQL Server 數(shù)據(jù)庫分區(qū)分表(水平分表)詳細步驟
最近幾個擔心網(wǎng)站數(shù)據(jù)量大會影響sqlserver數(shù)據(jù)庫的性能,所以提前將數(shù)據(jù)庫分表處理好,下面是ExceptionalBoy同學分享的詳細方法,需要的朋友可以參考下2021-03-03SQL SERVER 2012數(shù)據(jù)庫自動備份的方法
這篇文章主要為大家詳細介紹了SQL SERVER 2012數(shù)據(jù)庫自動備份的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-10-10sqlserver中在指定數(shù)據(jù)庫的所有表的所有列中搜索給定的值
最近因ERP項目,我們需要知道前臺數(shù)據(jù)導入功能Application操作的導入字段都寫入到了后臺數(shù)據(jù)庫哪些表的哪些列2011-09-09