一條 SQL 語句的內部執行流程詳解(MySQL為例)

當執行如下 SQL:

SELECT * FROM users WHERE id = 1;

在數據庫內部,其實會經歷多個復雜且有序的階段。以下是 MySQL(InnoDB 引擎)中 SQL 查詢語句從發送到結果返回的完整執行流程。


客戶端連接階段

  • 客戶端(如 JDBC、MySQL Shell)通過 TCP 與 MySQL 服務器建立連接。
  • 連接器模塊完成身份認證(用戶名/密碼)、權限校驗。
  • 若使用連接池,連接可能已被復用。

語法分析階段(Parser)

1. 詞法分析(Lexical Analysis)

  • 將 SQL 字符串拆解成關鍵字、標識符、操作符等 Token。
  • 例子:SELECT, *, FROM, users, WHERE, id, =, 1

2. 語法分析(Syntax Analysis)

  • 依據 SQL 語法規則生成抽象語法樹(AST)
  • 若語法不合法,此階段拋出語法錯誤。

預處理階段(Preprocessor)

  • 驗證表/字段是否存在。
  • 檢查當前用戶是否有訪問權限。
  • 解析字段別名、函數等表達式。
  • 確定查詢涉及的表和列。
  • 最終輸出邏輯查詢結構

查詢優化階段(Optimizer)

優化器根據預處理階段的語義結構生成最優執行計劃(Execution Plan)

1. 訪問路徑選擇

  • 使用 索引掃描 還是 全表掃描
  • 是否走覆蓋索引,是否需要回表?

2. 連接順序優化(Join Order)

  • 對多表 JOIN,決定訪問順序與連接方法(如 Nested Loop、Hash Join)。

3. 成本估算(Cost Estimation)

  • 評估每種執行方式的代價(IO 次數、內存使用等)。
  • 選擇代價最小的執行路徑。

查詢執行階段(Executor)

執行器根據優化器生成的執行計劃與存儲引擎交互,完成數據訪問。

執行器主要職責:

  • 調用引擎接口訪問表和索引。
  • 進行 WHERE 過濾、JOIN、聚合、排序、分組等操作。
  • 構造并返回最終結果集。

存儲引擎訪問階段(以 InnoDB 為例)

MySQL 使用插件式存儲引擎架構。以 InnoDB 為例:

  • 數據頁首先嘗試從 Buffer Pool(緩沖池)中讀取。
  • 若不在緩沖池,則從磁盤讀取并加入緩沖池。
  • 使用 B+ 樹索引定位記錄。
  • 如果為覆蓋索引(索引包含查詢列),可避免回表。
  • 對于非索引字段,需根據主鍵“回表”查找。

結果返回階段

  • 執行器生成的結果集通過 MySQL 協議格式化。
  • 數據從服務器通過網絡傳輸返回給客戶端。
  • 客戶端解析并展示結果。

日志與事務支持(InnoDB)

雖然 SELECT 查詢本身不會寫入日志,但其他 SQL 會涉及以下機制:

  • Undo Log:支持事務回滾、MVCC。
  • Redo Log:保證事務持久化(WAL機制)。
  • Binlog:記錄變更操作,用于主從復制和恢復。

注:查詢語句可能間接使用 undo log(如 MVCC)。


SQL 執行流程圖

Client Connector Parser Preprocessor Optimizer Executor StorageEngine 提交 SQL 查詢 權限校驗、連接管理 語法分析、語義分析 檢查字段/表、構造邏輯查詢塊 生成并下發最優執行計劃 根據執行計劃讀取數據(可能命中索引) 返回數據頁或記錄 返回結果集 Client Connector Parser Preprocessor Optimizer Executor StorageEngine

使用 EXPLAIN 查看執行計劃

EXPLAIN SELECT * FROM users WHERE id = 1;

查看字段含義:

  • id: 查詢標識
  • select_type: 查詢類型(SIMPLE/PRIMARY等)
  • table: 訪問的表
  • type: 連接類型(ALL、index、range、ref、const 等)
  • key: 使用的索引
  • rows: 掃描的行數
  • Extra: 是否使用臨時表、排序、是否回表等信息

查詢性能影響因素

影響因素說明
是否走索引非索引字段將觸發全表掃描
是否回表二級索引查詢非索引字段時需根據主鍵回表
連接數與并發并發高時,CPU/IO/鎖資源緊張
查詢緩存MySQL 8.0 起已廢棄
臨時表與排序ORDER BY / GROUP BY 可能觸發文件排序與臨時表
網絡延遲大結果集網絡傳輸慢

總結

一條 SQL 查詢的完整內部執行流程如下:

  1. 客戶端連接 → 建立連接并認證
  2. 解析 SQL → 詞法/語法分析生成語法樹
  3. 預處理 → 驗證權限與對象合法性
  4. 優化器選擇最優執行計劃
  5. 執行器執行 SQL 邏輯
  6. 存儲引擎讀取數據
  7. 返回結果集給客戶端

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/89973.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/89973.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/89973.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

超詳細yolo8/11-detect目標檢測全流程概述:配置環境、數據標注、訓練、驗證/預測、onnx部署(c++/python)詳解

文章目錄 一、配置環境二、數據標注三、模型訓練四、驗證預測五、onnx部署c 版python版本 一、配置環境 我的都是在Linux系統下,訓練部署的;模型訓練之前,需要配置好環境,Anaconda、顯卡驅動、cuda、cudnn、pytorch等&#xff1b…

阿里云Flink:開啟大數據實時處理新時代

走進阿里云 Flink 在大數據處理的廣袤領域中,阿里云 Flink 猶如一顆璀璨的明星,占據著舉足輕重的地位。隨著數據量呈指數級增長,企業對數據處理的實時性、高效性和準確性提出了前所未有的挑戰 。傳統的數據處理方式逐漸難以滿足這些嚴苛的需…

【Linux】基礎開發工具(1)

1. 軟件包管理器 1.1 什么是軟件包 在Linux下安裝軟件, ?個常用的辦法是下載到程序的源代碼, 并進行編譯, 得到可執行程序. 但是這樣太麻煩了, 于是有些人把?些常?的軟件提前編譯好, 做成軟件包(可以理解成windows上 的安裝程序)放在?個服務器上, 通過包管理器可以很?便…

藍橋杯51單片機設計

#超聲波原理# ①超聲波測距原理:聲波反射原理 聲波分類: 超聲波測距原理 超聲波頻率越高,波長越短,反身性越強,衍射性越弱 ②超聲波模塊原理 發射原理 跳線帽 接收原理 問題: 1.超聲波發射模塊需…

【LeetCode 熱題 100】240. 搜索二維矩陣 II——排除法

Problem: 240. 搜索二維矩陣 II 編寫一個高效的算法來搜索 m x n 矩陣 matrix 中的一個目標值 target 。該矩陣具有以下特性: 每行的元素從左到右升序排列。 每列的元素從上到下升序排列。 文章目錄 整體思路完整代碼時空復雜度時間復雜度:O(M N)空間復…

Android Input 系列專題【inputflinger事件的讀取與分發】

Android輸入系統在native中的核心工作就是,從Linux驅動設備節點中讀取事件,然后將這個事件進行分發,這兩項工作分別交給了InputReader和InputDispatcher來做。 他們的源碼都屬于native層inputflinger里面的一部分,如下架構&#…

【大模型LLM】GPU計算效率評估指標與優化方法:吞吐率

GPU計算效率評估指標與優化方法:吞吐率 一、核心效率指標二、大模型吞吐率(Large Model Throughput)三、關鍵性能瓶頸分析四、實際測量工具五、優化策略總結 一、核心效率指標 吞吐率(Throughput) 定義:單位…

Nestjs框架: 集成 Prisma

概述 在 NestJS 的官方文檔中,有兩處對數據庫進行了介紹 第一處位于左側“Techniques(技術)”部分下的“數據庫”板塊,中文文檔里同樣有這個位置。 Database 第二處是下面的“Recipes (秘籍)”板塊,這里有多個部分都與…

CppCon 2018 學習:What Do We Mean When We Say Nothing At All?

提供的內容深入探討了C編程中的一些關鍵概念,特別是如何編寫清晰、易維護的代碼,并展示了一些C17的新特性。我將對這些內容做中文的解釋和總結。 1. 良好的代碼設計原則 什么是“良好的代碼”? 能工作:代碼實現了預期功能。能在…

C語言中的輸入輸出函數:構建程序交互的基石

在C語言的世界里,輸入輸出(I/O)操作是程序與用戶或外部數據源進行交互的基本方式。無論是從鍵盤接收用戶輸入,還是將處理結果顯示到屏幕上,亦或是讀寫文件,都離不開C語言提供的輸入輸出函數。本文將深入探討…

高速信號眼圖

橫軸體系時域的抖動大小;縱軸體現電壓的噪聲。 噪聲越大,眼高越小。 抖動越大,眼寬越窄。 眼圖的模板是定義好的最大jitter和噪聲的模板范圍。就是信號的不可觸碰區域。信號波形不能夠觸碰到模板或者進行模板中。也就是眼圖中的線軌跡要在眼…

VisualSVN Server 禁止的特殊符號 導致的。具體分析如下:錯誤提示解讀

是由于 文件夾名稱中包含了 VisualSVN Server 禁止的特殊符號 導致的。具體分析如下&#xff1a; 錯誤提示解讀 錯誤信息明確說明&#xff1a; Folder name cannot contain following symbols < > : " / | and start or end by period. 即 文件夾名稱不能包含以下…

再見,WebSecurityConfigurerAdapter!你好,SecurityFilterChain

對于許多經驗豐富的 Spring開發者來說&#xff0c;WebSecurityConfigurerAdapter 是一個再熟悉不過的名字。在很長一段時間里&#xff0c;它幾乎是所有 Spring Security 配置的起點和核心。然而&#xff0c;隨著 Spring Boot 3.x 和 Spring Security 6.x 的普及&#xff0c;這個…

web前端面試-- MVC、MVP、MVVM 架構模式對比

MVC、MVP、MVVM 架構模式對比 基本概念 這三種都是用于分離用戶界面(UI)與業務邏輯的架構模式&#xff0c;旨在提高代碼的可維護性、可測試性和可擴展性。 1. MVC (Model-View-Controller) 核心結構&#xff1a; Model&#xff1a;數據模型和業務邏輯View&#xff1a;用戶界面展…

【C#】MVVM知識點匯總-2

在C#中實現MVVM&#xff08;Model-View-ViewModel&#xff09;架構時&#xff0c;可以總結以下幾個關鍵知識點&#xff0c;并通過具體的代碼示例來進行說明。 1. 模型 (Model) 模型包含應用程序中的數據和業務邏輯。通常與數據庫交互。 public class User { public int Id {…

一文了解PMI、CSPM、軟考、、IPMA、PeopleCert和華為項目管理認證

1 引言 常見的項目管理方面的認證有PMI、IPMA、PeopleCert、CSPM、軟考和華為項目管理認證6個認證。本篇文章讓你一文了解各認證的基本主要內容。 2 核心定位 目前全球范圍內最具影響力的六大認證體系各有特色&#xff0c;源于不同的管理哲學和實踐背景。六大認證體系的核心…

bean注入的過程中,Property of ‘java.util.ArrayList‘ type cannot be injected by ‘List‘

一、問題 在spring實踐bean注入ArrayList屬性的時候報錯&#xff1a;Property of ‘java.util.ArrayList’ type cannot be injected by ‘List’二、原因分析 在嘗試將 Spring 配置中的 注入到一個 ArrayList 類型的屬性時出現了類型不匹配問題。核心問題在于&#xff1a;Spr…

自注意力機制原理: 向量矩陣案例進行說明

自注意力機制原理: 向量矩陣案例進行說明 目錄 自注意力機制原理: 向量矩陣案例進行說明一個單詞和所有單詞進行乘法運算,提取特征一、場景設定:翻譯句子“我喜歡深度學習”二、向量矩陣構建:以“我”為例計算自注意力三、矩陣視角:批量計算整個序列的自注意力四、向量矩…

D3 面試題100道之(61-80)

這里是D3的面試題,我們從第 61~80題 開始逐條解答。一共100道,陸續發布中。 ?? 面試題(第 61~80 題) 61. D3 中如何繪制餅圖? 使用 d3.pie() 生成角度數據,再結合 d3.arc() 創建路徑。 示例: const data = [10, 20, 30

flutter更改第三方庫pub get的緩存目錄;更改.gradle文件夾存放目錄

1.在目標目錄中新建文件夾flutter_pub_cache 2.在“用戶變量“或“系統變量”中點擊“新建” 變量名: PUB_CACHE 變量值: D:\flutter_pub_cache 3.打開新的終端運行或者從Android studio 控制臺運行&#xff1a;flutter pub cache repair或者flutter pub clean pub讀取新的變…