MySQL分為四層架構,從上到下依次是:
1. 連接層(Connection Layer)
作用:處理客户端連接和權限驗證
客户端連接 → 連接池 → 權限驗證 → 分配線程
關鍵點:
- 管理連接池
- 用户認證、權限校驗
- 線程複用
2. 服務層(Service Layer)- Server層
作用:SQL的核心處理層
包含模塊:
- 查詢緩存:緩存SELECT結果(MySQL 8.0已移除)
- 解析器:詞法分析、語法分析,檢查SQL是否合法
- 優化器:選擇最優執行計劃(用哪個索引、表連接順序)
- 執行器:調用存儲引擎接口執行SQL
SQL → 解析器 → 優化器 → 執行器 → 調用引擎
3. 存儲引擎層(Storage Engine Layer)
作用:真正負責數據的存儲和讀取
常見引擎:
- InnoDB:支持事務、行鎖、外鍵(默認引擎)
- MyISAM:不支持事務,只有表鎖
- Memory:數據存內存,速度快但不持久化
-- 查看引擎
SHOW ENGINES;
-- 創建表時指定
CREATE TABLE users (...) ENGINE=InnoDB;
4. 文件系統層(File System Layer)
作用:持久化存儲
包含文件:
- 數據文件:
.ibd(表數據和索引) - 日誌文件:redo log、undo log、binlog
- 配置文件:
my.cnf - 錯誤日誌、慢查詢日誌等
一條SQL的執行流程
以 SELECT * FROM users WHERE id = 1 為例:
1. 連接層:驗證權限
↓
2. 服務層:
- 解析器:檢查SQL語法
- 優化器:決定使用主鍵索引
- 執行器:調用InnoDB接口
↓
3. 存儲引擎層:
- InnoDB讀取數據頁
- 返回結果給執行器
↓
4. 返回客户端
面試回答模板
簡潔版(30秒):
MySQL分為四層:連接層負責連接管理和權限驗證;服務層是核心,包括解析器、優化器、執行器,處理SQL邏輯;存儲引擎層負責數據存儲,InnoDB支持事務;文件系統層負責持久化。一條SQL從連接驗證→解析優化→執行→引擎讀取數據→返回結果。
詳細版(1分鐘):
MySQL採用分層架構:
- 連接層:管理客户端連接池,做權限認證
服務層:Server層,是SQL處理的核心
- 解析器做詞法語法分析
- 優化器選擇最優執行計劃
- 執行器調用存儲引擎接口
- 存儲引擎層:可插拔設計,InnoDB是默認引擎,支持事務、行鎖、MVCC
- 文件系統層:數據最終持久化,包括數據文件、redo log、binlog等
這種分層設計實現了存儲引擎可插拔,同一個Server層可以對接不同的引擎。
補充知識點(可能追問)
Q1: 為什麼要分層?
A:職責分離,存儲引擎可插拔,不同業務場景選擇不同引擎
Q2: Server層和引擎層的區別?
A:
- Server層:處理SQL邏輯,所有引擎共享
- 引擎層:負責數據存儲,不同引擎實現不同
Q3: binlog在哪一層?
A:Server層(所以所有引擎都有binlog)
Q4: redo log在哪一層?
A:存儲引擎層(只有InnoDB有redo log)
架構圖(文字版)
┌─────────────────────────────────────┐
│ 客户端(Client) │
└─────────────────────────────────────┘
↓
┌─────────────────────────────────────┐
│ 連接層:連接池、權限驗證 │
└─────────────────────────────────────┘
↓
┌─────────────────────────────────────┐
│ 服務層(Server層) │
│ ┌──────────────────────────────┐ │
│ │ 解析器 → 優化器 → 執行器 │ │
│ └──────────────────────────────┘ │
│ binlog、慢查詢日誌 │
└─────────────────────────────────────┘
↓
┌─────────────────────────────────────┐
│ 存儲引擎層(可插拔) │
│ InnoDB | MyISAM | Memory │
│ redo log、undo log │
└─────────────────────────────────────┘
↓
┌─────────────────────────────────────┐
│ 文件系統:數據文件、日誌文件 │
└─────────────────────────────────────┘