首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 邏輯架構深度解析:連接層、SQL層與存儲引擎層

     編輯:MySQL 資料庫相關知識

MySQL 邏輯架構深度解析

理解 MySQL 三層邏輯架構——連接管理層、SQL 處理層 (Server Layer)、存儲引擎層——是掌握查詢優化、故障診斷與架構設計的基石。本文結合官方架構圖,逐層拆解核心組件職責與交互流程。

架構總覽

MySQL 邏輯架構圖

圖 1-1 MySQL 邏輯架構圖

第一層:連接管理與安全 (Client Connectivity & Security)

  • 連接處理:每個客戶端連接分配專屬線程 (Thread-per-Connection),線程池化複用 (thread_cache_size) 減少創建銷毀開銷。未來版本計劃解耦連接與線程支援更高併發。
  • 認證鑒權:基於 User、Host、Password、SSL/X.509 綜合驗證。連接建立後,每條 SQL 執行前均做權限檢查 (全局 → 庫 → 表 → 列 → 程序)。
  • 網絡協議:MySQL 專用二進制協議,支援壓縮 (--compress)、SSL 加密、管道/共享內存 (Windows)。

第二層:SQL 處理層 (Server Layer / Query Processor)

MySQL 核心大腦,所有存儲引擎共享此層功能:

1. 查詢快取 (Query Cache) — 已於 8.0 移除

解析前檢查 SELECT 文本完全匹配 (Byte-by-byte),命中直接返回結果集,跳過解析/優化/執行。失效粒度為表級,任何寫入導致相關快取失效。8.0 移除原因:鎖競爭嚴重、命中率低、不支援並行查詢。

2. 解析器 (Parser)

  • 詞法/語法分析,生成解析樹 (AST)。
  • 驗證表/列存在性、權限、語法合法性。

3. 優化器 (Optimizer)

基於成本模型 (Cost Model) 選擇最優執行計畫:

  • 邏輯重寫:子查詢轉 Join、常數傳播、死碼消除、語義簡化。
  • 訪問路徑選擇:全表掃描 vs 索引掃描 (ref/range/index_merge) vs 覆蓋索引。
  • Join 順序枚舉:DP (Dynamic Programming) + 貪心搜尋,optimizer_search_depth 控制深度。
  • 統計資訊依賴:ANALYZE TABLE 更新索引基數、直方圖 (8.0+),優化器據此估算行數與選擇度。

Hint 干預:USE INDEX/IGNORE INDEX/FORCE INDEX、STRAIGHT_JOIN、MAX_EXECUTION_TIME。

4. 執行器 (Executor)

  • 按計畫調用存儲引擎 API 逐行取數、過濾、投影、排序、分組、聚合。
  • 臨時表物化 (Created_tmp_tables):內存 (tmp_table_size/max_heap_table_size) 或磁碟 (MyISAM/InnoDB)。
  • 結果集發送給客戶端 (網絡層分包 net_buffer_length → max_allowed_packet)。

5. 內建函數與共享組件

日期/時間、數學、加密、字串、JSON、GIS、窗口函數 (8.0+) 等;存儲過程、觸發器、視圖、CTE、準備語句 均在 Server Layer 實現,引擎無感。

第三層:存儲引擎層 (Storage Engine Layer)

負責數據的物理存儲、索引維護、事務管理、鎖控制、恢復機制。Server 通過統一 Handler API 與引擎交互,屏蔽實現差異。

特性InnoDB (預設)MyISAMMemoryNDB Cluster
事務/ACID✅ 支援❌❌✅ 分佈式
鎖粒度行鎖 + 間隙鎖表鎖表鎖行鎖
MVCC✅❌❌✅
外鍵✅❌❌❌
全文索引5.6+ ✅✅❌❌
壓縮頁面壓縮/透明壓縮✅ (myisampack)❌✅
崩潰恢復Redo/Undo Log❌ (需 REPAIR)數據丟失Checkpoint
適用場景OLTP、高併發、關鍵業務只讀/日誌/全文臨時計算/查找表高可用/分佈式

Handler API 關鍵操作

ha_open_record()      -- 打開表
ha_index_init()       -- 初始化索引讀取
ha_index_read_map()   -- 索引查找 (等於/範圍)
ha_rnd_next()         -- 全表掃描下一行
ha_write_row()        -- 插入行
ha_update_row()       -- 更新行
ha_delete_row()       -- 刪除行
ha_commit_trans()     -- 提交事務
ha_rollback_trans()   -- 回滾事務

引擎不解析 SQL (除 InnoDB 解析外鍵定義),不直接互通,僅響應 Server 請求,實現「查詢與存儲解耦」。

跨層交互關鍵流程:一條 SELECT 的生命週期

  1. 客戶端發送封包 → 連接線程接收 → 認證通過
  2. Server Layer:查詢快取 (已移除) → 解析器 → 優化器 (統計資訊 + 成本模型) → 生成執行計畫
  3. 優化器向引擎詢問:records_in_range()、index_flags()、table_flags() 估算成本
  4. 執行器調用 Handler API:index_read → rnd_next 取行 → 過濾/投影
  5. 引擎層:InnoDB 緩衝池命中 → 返回行;未命中 → 發起異步 I/O 讀取頁面 → 完成後回調
  6. 結果集組裝 → 網絡層分包發送 → 客戶端接收

架構演進趨勢

  • Server Layer 模組化:DDL 引擎、解析器重構 (Bison → 自研)、優化器成本模型 5.7 → 8.0 大幅重寫。
  • 存儲引擎插件化:MyRocks、TokuDB、Spider、CSV、Blackhole 等第三方引擎熱加載。
  • 線程池化:Thread Pool Plugin (Percona/Oracle 企業版) 解決高併發線程切換開銷。
  • 分佈式 SQL:Vitess、TiDB、MyCat、ShardingSphere 在 Server Layer 上層分片路由。

透徹理解三層架構,才能在 SQL 調優、引擎選型、故障定位、架構演進中做出正確決策。建議配合 PERFORMANCE_SCHEMA、sys schema 觀測各層延遲與瓶頸。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved