| 特性 | MyISAM | InnoDB |
|---|---|---|
| 儲存類型 | 非交易式 | 交易式 (ACID) |
| 鎖粒度 | 表鎖 | 行鎖 |
| 外鍵約束 | 不支援 | 支援 |
| 全文索引 | 支援 (5.6 前獨有) | 5.6+ 支援 |
| 資料行數統計 | 即時讀取 | 掃描計算 |
| 崩潰恢復 | 無 | Redo/Undo Log 自動恢復 |
| MVCC | 無 | 支援 (一致性非鎖定讀) |
| 預設 5.5+ | 否 | 是 |
-- MyISAM: O(1) 直接讀取儲存的行數
SELECT COUNT(*) FROM myisam_tbl;
-- InnoDB: O(N) 全表掃描 (MVCC 可見性檢查)
SELECT COUNT(*) FROM innodb_tbl;
-- WHERE 條件下兩者皆需掃描
TRUNCATE 或分批 DELETE ... LIMIT。僅支援 MyISAM。InnoDB 需先轉 MyISAM 匯入再轉回,但外鍵等特性會遺失。
InnoDB 無法確定掃描範圍時 (如 WHERE name LIKE '%aaa%') 會鎖全表。
COUNT(*),改用計數表或 information_schema.TABLES.TABLE_ROWS 估算。SET autocommit=0 + 批次 Commit,或 LOAD DATA INFILE。