| 維度 | InnoDB | MyISAM |
|---|---|---|
| 事務支持 | ✅ 完整 ACID(提交/回滾/崩潰恢復) | ❌ 不支持 |
| 鎖粒度 | ✅ 行級鎖(基於索引) | ❌ 僅表級鎖 |
| 外鍵約束 | ✅ 唯一支持外鍵的引擎 | ❌ |
| 全文索引 | ✅ 5.6.4+ 支持 | ✅ 早期優勢 |
| 索引結構 | 聚集索引(B+Tree,葉子節點存完整行) | 非聚集索引(B-Tree,葉子節點存行指針) |
| 主鍵要求 | 強制有主鍵(無則隱式生成 6 字節 RowID) | 可無主鍵 |
| COUNT(*) 性能 | 全表掃描計算 | O(1) 直接讀取統計值 |
| 崩潰恢復 | ✅ Redo/Undo Log 分鐘級恢復 | ❌ 需人工修復,耗時數小時 |
| 文件結構 | .ibd (表空間) / 共享表空間 ibdata1 | .frm .MYD .MYI 三文件分離 |
| 壓縮支持 | 頁面壓縮 / 表壓縮 (Barracuda) | ✅ 壓縮表 (myisampack) |
| 緩存機制 | Buffer Pool 緩存數據+索引 | Key Buffer 僅緩存索引,數據依賴 OS Cache |
-- 行鎖:WHERE 條件包含索引列
UPDATE t SET c=1 WHERE id=100; -- 主鍵索引
UPDATE t SET c=1 WHERE idx_col='abc'; -- 二級索引
-- 表鎖:無索引或範圍模糊
UPDATE t SET c=1 WHERE name LIKE '%abc%'; -- 全表掃描 → 表鎖
SELECT COUNT(*) FROM t; -- 全表掃描 → 表鎖
誤區警示: InnoDB 行鎖**不是無條件的**,只有通過索引定位記錄時才加行鎖,否則退化為表鎖。
| 格式 | 特徵 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|---|
| 靜態表 | 固定長度列,行長固定 | 極快、易緩存、易恢復 | 空間浪費(尾部補空格) | 全定長列、高頻讀、少更新 |
| 動態表 | 含變長列 | 節省空間 | 碎片化、恢復難、需定期 OPTIMIZE | 含 VARCHAR/TEXT/BLOB、通用場景 |
| 壓縮表 | myisampack 生成,唯讀 | 極小空間、極低訪問開銷 | 不可修改、需解壓讀取 | 歸檔數據、只讀查詢 |
LOAD TABLE FROM MASTER 僅支持 MyISAM,InnoDB 需先轉 MyISAM 導入再轉回DELETE FROM table:InnoDB 逐行刪除(慢),MyISAM 重建表(快,但 5.7+ InnoDB 也支持 TRUNCATE 即時)AUTO_INCREMENT:InnoDB 單列索引,MyISAM 允許聯合索引首列ANALYZE TABLE 兩者均支持,InnoDB 為抽樣估算**InnoDB 是 MySQL 5.5+ 默認、生產核心業務首選引擎**。MyISAM 僅在「無事務、極致讀性能、文件級備份遷移、舊版本全文索引」等邊緣場景保留價值。理解「聚集 vs 非聚集索引」、「行鎖需索引」、「崩潰恢復機制」三大核心差異,是避坑與調優的基石。