一條 SQL 查詢語句是如何執行的(MySQL)

第一講:一條 SQL 查詢語句是如何執行的

總覽圖示

MySQL 查詢的執行流程可以大致分為以下步驟(如圖所示):

  1. 連接器(Connection)
  2. 查詢緩存(Query Cache,MySQL 8.0 已廢棄)
  3. 分析器(Parser)
  4. 優化器(Optimizer)
  5. 執行器(Executor)

整個 MySQL 架構分為 Server 層存儲引擎層(Storage Engine)

Server 層存儲引擎層
連接器、查詢緩存、分析器、優化器、執行器、內置函數、觸發器、視圖、存儲過程等數據的實際存儲與讀取,支持 InnoDB、MyISAM、Memory 等引擎

一、連接器(Connector)

負責管理客戶端連接、驗證身份、權限檢查及連接生命周期維護。

mysql -h<ip地址> -P<端口> -u<用戶名> -p

工作流程:

  1. 驗證用戶身份:連接后輸入密碼,系統校驗用戶名/密碼是否正確。
  2. 權限校驗:認證通過后,系統會從權限表讀取用戶權限。更改權限后需重新連接才能生效
  3. 連接狀態管理:長時間不操作,連接會因 wait_timeout 參數超時自動斷開(默認8小時)。
  4. 長連接問題
    • 長連接可減少連接頻率,但可能導致內存膨脹。
    • 推薦措施:
      • 定期斷開或重置連接。
      • 使用 mysql_reset_connection(MySQL 5.7+)釋放連接資源,但不需重新驗證權限。

二、查詢緩存(Query Cache)

說明:MySQL 8.0 已徹底移除查詢緩存功能,以下內容適用于舊版本。

工作原理:

  • 執行 SELECT 語句前,先檢查是否有完全相同的 SQL 已執行過并緩存在內存中(key=語句文本,value=結果集)。
  • 命中緩存則直接返回結果,跳過后續步驟。
  • 未命中則執行后續流程,并將結果緩存。

使用建議:

  • 查詢緩存對動態更新頻繁的表幾乎無效,一旦表被修改,與其相關的所有緩存都會失效。

  • 只適合查詢頻率高、更新頻率低的靜態表(如配置表)。

  • 推薦按需使用:

    SELECT SQL_CACHE * FROM T WHERE ID=10;
    

三、分析器(Parser)

將 SQL 文本轉換為數據庫能識別的結構形式(語法分析 + 詞法分析)。

功能:

  1. 詞法解析:識別關鍵詞、表名、字段名等組成部分。
  2. 語法檢查:驗證 SQL 是否符合語法規范。

示例:

elect * from t where ID=1;

報錯信息:

ERROR 1064 (42000): You have an error in your SQL syntax;

錯誤提示會定位到第一個出錯的位置,關注提示中的 use near 即可定位錯誤代碼段。


四、優化器(Optimizer)

SQL 有多種執行方式,優化器選擇最優執行路徑。

功能:

  • 決定使用哪個索引(如多索引場景)
  • 決定多表 JOIN 順序(不同順序會影響執行效率)

示例:

SELECT * FROM t1 JOIN t2 USING(ID) WHERE t1.c=10 AND t2.d=20;

兩種執行方案:

  1. 先查 t1.c=10,再連表 t2 判斷 t2.d=20
  2. 先查 t2.d=20,再連表 t1 判斷 t1.c=10

優化器會選擇代價(成本)最低的執行路徑。


五、執行器(Executor)

執行器按優化器選擇的方案實際執行查詢語句。

流程:

  1. 權限檢查:再次驗證用戶是否對該表有查詢權限。
  2. 調用引擎接口:根據是否有索引,選擇不同的數據讀取方式。

無索引執行流程:

SELECT * FROM T WHERE ID=10;

執行器會:

  1. 順序讀取每一行(全表掃描)
  2. 判斷是否滿足 ID=10 條件
  3. 滿足則加入結果集
  4. 返回所有結果集給客戶端

有索引執行流程:

  • 使用索引快速定位滿足條件的記錄。
  • 使用“滿足條件的第一行” → “下一行”的迭代接口。
  • 查詢效率顯著提升。

在慢查詢日志中可以看到 Rows_examined 字段,即執行過程中掃描的數據行數。

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

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

相關文章

汽車OTA在線升級法規分析

摘要 本文介紹了R156法規即《關于批準車輛的軟件升級和軟件升級管理體系統一規定的法規》、該法規專注于汽車軟件升級功能&#xff0c;并為此提出了一系列具體要求&#xff0c;旨在確保軟件升級流程的安全性、可控性和合規性&#xff0c;從而順應汽車行業智能化、聯網化的發展趨…

Notepad編輯器實現換行符替換

在不同的Note編輯器中&#xff0c;批量把換行替換為空的方法有所不同&#xff0c;以下是常見編輯器的操作方法&#xff1a; Notepad 打開文件后&#xff0c;按CtrlH打開“查找和替換”對話框&#xff0c;在“查找”字段中輸入\r\n&#xff0c;在“替換為”字段中輸入一個空格…

Rust多線程性能優化:打破Arc+鎖的瓶頸,效率提升10倍

一、引言 在 Rust 開發中&#xff0c;多線程編程是提升程序性能的重要手段。Arc&#xff08;原子引用計數&#xff09;和鎖的組合是實現多線程數據共享的常見方式。然而&#xff0c;很多程序員在使用 Arc 和鎖時會遇到性能瓶頸&#xff0c;導致程序運行效率低下。本文將深入剖…

【安裝指南】Centos7 在 Docker 上安裝 RabbitMQ4.0.x

目錄 前置知識:RabbitMQ 的介紹 一、單機安裝 RabbitMQ 4.0.7版本 1.1 在線拉取鏡像 二、延遲插件的安裝 2.1 安裝延遲插件 步驟一:下載延遲插件 步驟二:將延遲插件放到插件目錄 步驟三:啟動延遲插件 步驟四:重啟 RabbitMQ 服務 步驟五:驗收成果 步驟六:手動…

【quantity】5 derive_more庫 2.0 版介紹

derive_more 是一個 Rust 過程宏庫&#xff0c;旨在通過派生宏自動生成常見 trait 的實現&#xff0c;減少樣板代碼。2.0 版本帶來了多項改進和新特性。 主要特性 1. 支持的 Trait 派生 derive_more 2.0 支持派生以下 trait&#xff1a; 基本操作 trait: Display - 格式化顯…

網站備份,網站數據備份的步驟

網站備份&#xff08;尤其是網站數據備份&#xff09;是保障業務連續性、防止數據丟失和應對安全威脅的關鍵措施。以下是系統化的備份步驟和實施建議&#xff0c;涵蓋技術操作、策略規劃及常見問題處理&#xff1a; 一、備份前的準備工作 明確備份范圍 核心數據&#xff1a;…

OpenCV 圖形API(72)圖像與通道拼接函數-----根據指定的方式翻轉圖像(GMat)函數 flip()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 翻轉一個2D矩陣&#xff0c;圍繞垂直軸、水平軸或同時圍繞兩個軸。 該函數以三種不同的方式之一翻轉矩陣&#xff08;行和列的索引是從0開始的&a…

醫生視角下轉錄組學的生物信息學分析

醫生視角下轉錄組學的生物信息學分析 轉錄組學的生物信息學分析是醫生解決臨床與科研問題的有力工具。這里羅列醫學轉錄組學相關的幾個概念&#xff0c;從使用者&#xff08;醫生&#xff09;的角度看待理解相關技術&#xff0c;為后續使用該技術說明臨床和科研問題奠定基礎。…

量子機器學習中的GPU加速實踐:基于CUDA Quantum的混合編程模型探索

引言&#xff1a;量子機器學習的新范式 在量子計算與經典機器學習交叉融合的前沿領域&#xff0c;量子機器學習&#xff08;Quantum Machine Learning, QML&#xff09;正經歷著革命性突破。然而&#xff0c;隨著量子比特規模的增長和算法復雜度的提升&#xff0c;傳統計算架構…

Matplotlib核心課程-2

4.1 數據加載、儲存 4.1.1 從數據文件讀取數據 導入支持庫&#xff1a; import numpy as np from pandas import Series,DataFrame import pandas as pd 從csv文件讀取數據&#xff0c;一般方法&#xff1a; pd.read_csv(../data/ex1.csv,encodinggbk) 從csv文件讀取數據&#…

new和malloc的區別

1 語義層級不同&#xff1a;語言機制 vs. 庫函數 new / new[] (C 關鍵字)malloc / calloc / realloc (C 運行時函數)本質語言級運算符&#xff1b;可被重載庫函數&#xff1b;無法重載作用分配內存 并調用構造函數僅分配原始字節塊&#xff0c;不做初始化&#xff0c;也不調用…

C++11新特性_自動類型推導_auto

在 C11 標準中&#xff0c;auto關鍵字被賦予了全新且強大的功能&#xff0c;它用于自動類型推導&#xff0c;即編譯器能夠根據變量的初始化表達式自動確定其類型。 基本語法 使用auto聲明變量時&#xff0c;只需給出auto關鍵字&#xff0c;后面緊跟變量名&#xff0c;并對其進…

[預備知識]6. 優化理論(二)

優化理論 本章節介紹深度學習中的高級優化技術&#xff0c;包括學習率衰減、梯度裁剪和批量歸一化。這些技術能夠顯著提升模型的訓練效果和穩定性。 學習率衰減&#xff08;Learning Rate Decay&#xff09; 數學原理與可視化 學習率衰減策略的數學表達&#xff1a; 步進式…

【計算機視覺】語義分割:Mask2Former:統一分割框架的技術突破與實戰指南

深度解析Mask2Former&#xff1a;統一分割框架的技術突破與實戰指南 技術架構與創新設計核心設計理念關鍵技術組件 環境配置與安裝指南硬件要求安裝步驟預訓練模型下載 實戰全流程解析1. 數據準備2. 配置文件定制3. 訓練流程4. 推理與可視化 核心技術深度解析1. 掩膜注意力機制…

數字智慧方案5857丨智慧機場解決方案與應用(53頁PPT)(文末有下載方式)

資料解讀&#xff1a;智慧機場解決方案與應用 詳細資料請看本解讀文章的最后內容。 隨著科技的飛速發展&#xff0c;智慧機場的建設已成為現代機場發展的重要方向。智慧機場不僅提升了旅客的出行體驗&#xff0c;還極大地提高了機場的運營效率。本文將詳細解讀沃土數字平臺在…

【C到Java的深度躍遷:從指針到對象,從過程到生態】第五模塊·生態征服篇 —— 第二十章 項目實戰:從C系統到Java架構的蛻變

一、跨語言重構&#xff1a;用Java重寫Redis核心模塊 1.1 Redis的C語言基因解析 Redis 6.0源碼核心結構&#xff1a; // redis.h typedef struct redisObject { unsigned type:4; // 數據類型&#xff08;String/List等&#xff09; unsigned encoding:4; // …

ES6異步編程中Promise與Proxy對象

Promise 對象 Promise對象用于解決Javascript中的地獄回調問題&#xff0c;有效的減少了程序回調的嵌套調用。 創建 如果要創建一個Promise對象&#xff0c;最簡單的方法就是直接new一個。但是&#xff0c;如果深入學習&#xff0c;會發現使用Promise下的靜態方法Promise.re…

UE自動索敵插件Target System Component

https://www.fab.com/zh-cn/listings/9088334d-3bde-4e10-a937-baeb780f880f ? 一個完全用 C 編寫的 UE插件&#xff0c;添加了對簡單相機鎖定/瞄準系統的支持。它最初??在藍圖中開發和測試&#xff0c;然后轉換并重寫為 C 模塊和插件。 特征&#xff1a; 可通過一組可在…

中小企業MES系統概要設計

版本&#xff1a;V1.0 日期&#xff1a;2025年5月2日 一、系統架構設計 1.1 整體架構模式 采用分層微服務架構&#xff0c;實現模塊解耦與靈活擴展&#xff0c;支持混合云部署&#xff1a; #mermaid-svg-drxS3XaKEg8H8rAJ {font-family:"trebuchet ms",verdana,ari…

STM32移植U8G2

STM32 移植 U8G2 u8g2 &#xff08;Universal 8bit Graphics Library version2 的縮寫&#xff09;是用于嵌入式設備的單色圖形庫&#xff0c;可以在單色屏幕中繪制 GUI。u8g2 內部附帶了例如 SSD13xx&#xff0c;ST7xx 等很多 OLED&#xff0c;LCD 驅動。內置多種不同大小和風…