| 特性 | InnoDB | MyISAM |
|---|---|---|
| 事務支持 | ✅ 完整 ACID | ❌ 不支持 |
| 外鍵約束 | ✅ 支持 | ❌ 不支持 |
| 鎖粒度 | 行級鎖(意向鎖) | 表級鎖 |
| 全文索引 | 5.6+ 支持 | ✅ 原生支持 |
| 行數統計 | 實時掃描 | 元數據直接讀取 |
| 自增主鍵 | 需單列索引 | 允許聯合索引 |
| DELETE 全表 | 逐行刪除 | 重建表(極快) |
| 數據文件 | 共享表空間 + .ibd | .frm .MYD .MYI 三文件 |
| 壓縮特性 | 頁面壓縮(透明) | 索引壓縮(myisampack) |
| 崩潰恢復 | Redo/Undo Log 自動恢復 | 需手動修復 |
InnoDB 行級鎖基於索引生效:WHERE pk = 1 走主鍵索引僅鎖定該行;WHERE name LIKE '%abc%' 全表掃描將升級為表鎖。MyISAM 永遠是表鎖,讀寫互斥,高並發寫入性能瓶頸明顯。
-- InnoDB 必須全表掃描聚合
SELECT COUNT(*) FROM huge_table; -- 慢
-- MyISAM 直接讀取元數據
SELECT COUNT(*) FROM huge_table; -- 极快
-- 帶 WHERE 條件時兩者一致
SELECT COUNT(*) FROM huge_table WHERE status = 1;
myisampack),內存利用率高,適合只讀/讀多寫少場景;COMPRESSED 行格式),體積通常較大 20%-30%。| 運維場景 | MyISAM 優勢 | InnoDB 劣勢 |
|---|---|---|
| 誤 UPDATE 回滾 | 直接複製 .MYD/.MYI 文件秒級恢復 | 需導出 SQL 再導入,十 GB 級耗時極長 |
| 跨實例數據分發 | 發送三文件即可掛載 | 受數據字典綁定,必須導出 SQL |
| 大表歸檔/合併 | MRG_MyISAM 引擎透明合併查詢 | 需分區表或應用層路由 |
生產環境常採用「核心表 InnoDB + 非核心大表 MyISAM」混合架構,配合分庫分表、讀寫分離,在事務安全與查詢性能間取得平衡。MySQL 8.0 已大幅優化 InnoDB 只讀性能與壓縮能力,新項目傾向全 InnoDB 部署更為普遍。
DELETE FROM table,使用 TRUNCATE 或分批刪除;LOAD TABLE FROM MASTER,該命令不支持;Innodb_row_lock_waits 與 Table_locks_waited,及時發現鎖爭用熱點;
OPTIMIZE TABLE 碎片整理,維持查詢性能。