MySQL 支援多種儲存引擎,各具特色。建表時透過 ENGINE=引擎名 指定,後期更換成本極高,因此架構初期必須根據業務特性做正確選型。
CREATE TABLE `news` (
`id` INT NOT NULL AUTO_INCREMENT,
`name` VARCHAR(45) NULL,
`content` VARCHAR(45) NULL,
`created` VARCHAR(45) NULL,
PRIMARY KEY (`id`)
) ENGINE = MyISAM;
注意: 表名大小寫敏感度取決於作業系統(Windows 不敏感、Linux 敏感)。
MySQL 內建引擎眾多:MyISAM、InnoDB、Memory、Archive、CSV、Federated、Blackhole、NDB Cluster 等。實務上最常用的三大引擎足以覆蓋 90% 以上場景。
| 特性 | MyISAM | InnoDB | Memory |
|---|---|---|---|
| 預設引擎 | 5.5 前為預設 | 5.5+ 為預設 | 否 |
| 事務支援 | ❌ 不支援 | ✅ 完整 ACID | ❌ 不支援 |
| 鎖粒度 | 表級鎖 | 行級鎖 | 表級鎖 |
| 外鍵約束 | ❌ | ✅ | ❌ |
| 全文索引 | ✅ (5.6+ InnoDB 也支援) | ✅ (5.6+) | ❌ |
| 資料持久化 | 檔案儲存 | 表空間 (ibdata/ibd) | 僅記憶體,重啟資料消失 |
| 索引/資料載入速度 | 快 | 較慢 | 極快 (無 I/O) |
| 並發效能 | 低 (表鎖) | 高 (行鎖+MVCC) | 高 (但受表鎖限制) |
| 崩潰恢復 | 困難 | Redo/Undo Log 自動恢復 | 不可恢復 |
-- 查看表引擎
SHOW CREATE TABLE tbl_name;
SHOW TABLE STATUS FROM db_name WHERE Name='tbl_name';
-- 修改引擎 (會重建表,鎖表時間長,大表慎用)
ALTER TABLE tbl_name ENGINE=InnoDB;
-- 修改預設引擎 (僅影響後續建表)
SET default_storage_engine=InnoDB;
-- 或啟動參數 --default-storage-engine=InnoDB
總結:不確定時選 InnoDB。MyISAM 適用特定唯讀場景,Memory 僅作暫存加速。引擎選型是架構設計的基石,切勿草率決定。