一、邏輯架構核心組件
1. 並發控制:鎖機制
| 鎖類型 | 別名 | 特性 | 代表引擎 |
| 讀鎖 | 共享鎖 (S鎖) | 互不阻塞,多事務可同時讀;阻塞寫 | MyISAM (表鎖) |
| 寫鎖 | 排他鎖 (X鎖) | 互斥:阻塞其他讀/寫 | InnoDB (行鎖) |
2. 鎖粒度權衡
- 表鎖:開銷小、加鎖快、無死鎖,**並發度極低** (MyISAM)
- 行鎖:開銷大、加鎖慢、可能死鎖,**並發度極高** (InnoDB)
- **策略**:鎖定**僅需修改的資源**,粒度越小並發越好,但系統開銷越大。
3. 事務 ACID 特性
| 特性 | 含義 | InnoDB 實現 |
| 原子性 | 全做或全不做 | Undo Log 回滾 |
| 一致性 | 約束前後狀態一致 | 外鍵、唯一索引、檢查約束 |
| 隔離性 | 事務互不干擾 | MVCC + 行鎖 (RR 級別默認) |
| 持久性 | 提交後永久生效 | Redo Log (WAL) 刷盤 |
二、主流存儲引擎對比
| 特性 | MyISAM | InnoDB (默認 5.5+) |
| 文件結構 | .frm(定義) .MYD(數據) .MYI(索引) | .frm(定義) + 共享表空間 ibdata1 / 獨立表空間 .ibd |
| 事務支援 | ❌ | ✅ ACID 完整支援 |
| 鎖粒度 | 表鎖 | 行鎖 (意向鎖、間隙鎖、Next-Key Lock) |
| 外鍵約束 | ❌ | ✅ |
| 索引類型 | 非聚簇 (堆表) | **聚簇索引** (主鍵即數據) |
| 全文索引 | 5.6+ 支援 | 5.6+ 支援 |
| 壓縮表 | ✅ `myisampack` | ✅ 透明頁壓縮 / `COMPRESSED` 行格式 |
| 崩潰恢復 | 慢、需 `REPAIR TABLE` | 快、Redo Log 自動恢復 |
| 熱備份 | ❌ 鎖表 | ✅ `xtrabackup` / `mysqlbackup` 無鎖 |
| 主鍵查詢 | 需回表 | 極快 (聚簇索引直接命中) |
三、選型決策指南
✅ 選擇 InnoDB (90%+ 場景)
- 需要事務 (金融、訂單、庫存)
- 高並發寫入 (行鎖優勢)
- 需外鍵約束保證完整性
- 需熱備份 / 快速崩潰恢復
- 主鍵查詢為主 (聚簇索引)
- **MySQL 5.7/8.0 默認且強烈推薦**
🟡 選擇 MyISAM (極少數場景)
- 純只讀 / 讀多寫極少 (日誌、報表快照)
- 不需要事務、外鍵
- 表較小、崩潰恢復時間可接受
- 需全文索引 (5.6 前)
- 嵌入式設備、極度資源受限環境
四、查看表引擎
SHOW TABLE STATUS LIKE 'table_name'\G
-- 關鍵輸出: Engine: InnoDB / MyISAM
五、遷移建議
ALTER TABLE t ENGINE = InnoDB; -- 鎖表操作,大表建議 pt-online-schema-change