理解 MySQL 架構是性能調優、故障診斷、架構設計的基石。本文基於官方架構圖,深度解析四大核心層(連接池、查詢處理、優化執行、存儲引擎)及 InnoDB 關鍵子系統(鎖、事務、MVCC)。

thread_cache_size)user@host)mysql.user、db、tables_priv 等授權表max_connections、max_user_connections、skip-name-resolve(避免 DNS 解析延遲)query_cache_type=OFF)range/ref/eq_ref)、連接順序、子查詢轉換(Materialization/Semi-join)、ICP/MRR/BKA 等優化特性啟用information_schema.statistics、直方圖)估算代價optimizer_switch 控制各項優化規則開關handler::index_read、handler::rnd_next 等)EXPLAIN 可見的執行計劃輸出| 維度 | 表鎖 | 行鎖 |
|---|---|---|
| 粒度 | 整張表 | 單行記錄 |
| 資源消耗 | 極低 | 較高 |
| 並發度 | 極低(寫鎖阻塞所有讀寫) | 高(僅阻塞衝突行) |
| 死鎖風險 | 無 | 有 |
| 適用引擎 | MyISAM、MEMORY | InnoDB |
意向鎖(IS/IX):行鎖與表鎖共存的協議,事務獲取行鎖前必須先獲取表級意向鎖。
-- 事務 1 START TRANSACTION; UPDATE user SET name='張三' WHERE id=1; -- 鎖定 id=1 SELECT SLEEP(5); UPDATE user SET name='李四' WHERE id=2; -- 等待 id=2 COMMIT; -- 事務 2 START TRANSACTION; UPDATE user SET name='張三' WHERE id=2; -- 鎖定 id=2 SELECT SLEEP(5); UPDATE user SET name='李四' WHERE id=1; -- 等待 id=1 → 死鎖 COMMIT;
InnoDB 通過等待圖檢測死鎖,自動回滾持有較少鎖/權重較低的事務(innodb_deadlock_detect=ON)。
| 級別 | 髒讀 | 不可重複讀 | 幻讀 | InnoDB 實現 |
|---|---|---|---|---|
| READ UNCOMMITTED | ✅ | ✅ | ✅ | 直接讀最新版本,無鎖 |
| READ COMMITTED | ❌ | ✅ | ✅ | 每次 SELECT 生成 ReadView,RC 下每條語句新生成 |
| REPEATABLE READ(默認) | ❌ | ❌ | ❌* | 事務首次 SELECT 生成 ReadView,全程復用;Next-Key Lock 防幻讀 |
| SERIALIZABLE | ❌ | ❌ | ❌ | 讀加共享鎖,寫加排他鎖,完全串行化 |
* RR 級別下 InnoDB 通過 Next-Key Lock(記錄鎖+間隙鎖)大程度防止幻讀,但極端並發下仍可能出現。
COMMIT/ROLLBACK 時一次性釋放LOCK TABLES/UNLOCK TABLES(Server 層,與引擎無關)、SELECT ... FOR UPDATE、SELECT ... LOCK IN SHARE MODELOCK TABLES:會導致隱式提交,破壞事務原子性SHOW VARIABLES LIKE 'autocommit'; -- ON/OFF SET autocommit = 0; -- 會話級關閉 START TRANSACTION; -- 顯式開啟 COMMIT / ROLLBACK; -- 結束事務並恢復 autocommit
⚠️ DDL(CREATE/ALTER/DROP)、LOCK TABLES 會強制隱式提交。
MySQL 架構分層清晰:Server 層負責連接、解析、優化、執行;引擎層負責存儲、索引、鎖、事務、MVCC。InnoDB 作為默認引擎,其行鎖、MVCC、WAL、Change Buffer、Automatic Purge 等機制共同支撐高並發、高可靠的 OLTP 負載。深入理解各層交互,是從「會用」進階到「懂原理、能調優」的關鍵。