存儲引擎是 MySQL 核心組件,負責處理不同表類型的 SQL 操作。MySQL 採用可插拔式存儲引擎架構,允許在運行時動態載入/卸載引擎。InnoDB 是 5.6 版起的預設引擎,也是最常用、 Oracle 官方推薦的選擇,除非有特殊場景需求。
| 特性 | MyISAM | Memory | InnoDB | Archive | NDB Cluster |
|---|---|---|---|---|---|
| 儲存上限 | 256TB | RAM | 64TB | 無 | 384EB |
| 交易支援 | 否 | 否 | 是 | 否 | 是 |
| 鎖定粒度 | 表級 | 表級 | 行級 | 行級 | 行級 |
| MVCC | 否 | 否 | 是 | 否 | 否 |
| 外鍵支援 | 否 | 否 | 是 | 否 | 否 |
| 全文索引 | 是 | 否 | 5.6.4+ 支援 | 否 | 否 |
| 叢集索引 | 否 | 否 | 是 | 否 | 否 |
| 資料壓縮 | 是 | 否 | Barracuda 格式支援 | 是 | 否 |
| 複製支援 | 是 | 是 | 是 | 是 | 是 |
CREATE TABLE t1 (id INT) ENGINE = InnoDB;
CREATE TABLE t2 (id INT) ENGINE = CSV;
--default-storage-engine=InnoDBdefault-storage-engine=InnoDBSET default_storage_engine=NDBCLUSTER;ALTER TABLE t ENGINE = InnoDB;
若指定引擎不可用,MySQL 預設會替換為預設引擎並發出警告;啟用 NO_ENGINE_SUBSTITUTION SQL 模式可改為報錯。
.frm(結構)、.MYD(資料)、.MYI(索引)myisampack 產生,唯讀)PACK_KEYS 控制壓縮CHECK TABLE / REPAIR TABLE 或離線 myisamchkVARCHAR 亦按定義長度佔用記憶體BLOB/TEXT、空間資料類型max_heap_table_size 限制(預設 16MB)USING 子句指定--init-file 重載資料同步 SlaveNOT NULLCHECK TABLE / REPAIR TABLE 自動修復AUTO_INCREMENT 索引,不支援其他索引DELETE/UPDATE/REPLACE,適合唯讀歸檔OPTIMIZE TABLE 可進一步壓縮整理INSERT 觸發器生效優點: 簡化日誌管理、跨磁盤分散大表提升速度、單表修復更快、突破單檔大小限制。
缺點: 僅支援 MyISAM 底表、無法強制唯一性約束、索引查詢較慢(需掃描所有底表)、檔案描述符消耗大、不支援分區與部份 DDL。
ALTER TABLE、分區、查詢快取mysql://user:pass@host:port/db/table 或透過 CREATE SERVER 共用連線定義INSTALL PLUGIN example SONAME 'ha_example.so';
UNINSTALL PLUGIN example;
共享庫需置於 plugin_dir 目錄,操作需 mysql.plugin 表插入權限。卸載前確保無表使用該引擎,否則既有表將無法存取。
選擇建議: 除非有明確理由(如唯讀壓縮存檔用 Archive、跨實例查詢用 Federated),生產環境核心業務表請優先使用 InnoDB,並善用 SHOW ENGINES 確認引擎可用性。