文章目錄
- 一、執行流程
- 二、建立連接
- 三、預處理器
- 四、解析器
- 4.1 詞法分析
- 4.2 語法分析
- 4.3 語義分析
- 五、優化器
- 六、執行器
- 七、返回結果
一、執行流程
階段 | 主要功能 | 關鍵組件 |
---|---|---|
1. 建立連接 | 身份驗證、權限檢查 | 連接器 |
2. 預處理器 | 緩存檢查、SQL預處理 | 查詢緩存 |
3. 解析器 | 詞法分析、語法分析、語義檢查 | 解析器 |
4. 優化器 | 生成最優執行計劃 | 查詢優化器 |
5. 執行器 | 按計劃執行查詢 | 執行引擎 |
6. 返回數據 | 結果返回、資源清理 | 結果處理器 |
二、建立連接
當應用程序需要執行SQL語句時,首先需要與數據庫服務器建立連接:
# 建立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;
詞法分析結果:
標記 | 類型 | 說明 |
---|---|---|
SELECT | 關鍵字 | SQL關鍵字 |
name | 標識符 | 字段名 |
, | 分隔符 | 逗號分隔符 |
age | 標識符 | 字段名 |
FROM | 關鍵字 | SQL關鍵字 |
users | 標識符 | 表名 |
WHERE | 關鍵字 | SQL關鍵字 |
> | 操作符 | 比較操作符 |
18 | 數值常量 | 整數字面量 |
4.2 語法分析
根據SQL語法規則構建抽象語法樹(AST):
SELECT/ \字段列表 FROM子句/ \ |name age users表|WHERE子句|條件表達式/ | \age > 18
4.3 語義分析
進行語義層面的檢查和驗證:
- 表存在性檢查:查詢表信息是回去數據庫查詢是否有這個表。
- 字段存在性檢查:查詢字段信息是回去數據庫表查詢是否有這個字段。
- 權限檢查:設計表或數據庫的刪除要檢查當前用戶的權限。
- 約束檢查:查詢表的主外鍵、不為空、唯一等約束條件。
五、優化器
選擇代價最小的執行計劃,從而提高 SQL 執行效率,場見的優化場景如下:
- 確定多表連接順序
- 是否使用索引?使用哪個索引?
- 選擇合適的執行算法(嵌套循環 / 哈希連接 / 排序 / 歸并等)
示例SQL:
SELECT name FROM student WHERE age > 18;
執行器的執行過程可能如下:
- 使用 B+ 樹索引快速定位滿足 age > 18 的主鍵 ID;
- 根據主鍵回表獲取 name 字段;
- 逐行拼裝結果集并返回給客戶端。
六、執行器
根據執行計劃,具體執行 SQL。
步驟:
- 訪問表、索引,執行 WHERE 條件過濾
- 做連接操作、聚合、排序等
- 將結果寫入結果集返回客戶端
七、返回結果
查詢執行完成后,將結果返回給客戶端。
比如下面的 SQL:
SELECT id, name FROM user LIMIT 2;
結果集在返回客戶端前,格式如下:
+----+--------+
| id | name |
+----+--------+
| 1 | Alice |
| 2 | Bob |
+----+--------+