MySQL 支持多种存储引擎,每种引擎有各自的数据存储方式、锁机制、事务支持等特点。在 MySQL 5.5 之后,默认引擎为 InnoDB,也是目前最常用的生产级引擎。
下面列出几种主流存储引擎及其特点:
| 引擎 | 事务 | 外键 | 锁粒度 | 主要特点 | 适用场景 |
|---|---|---|---|---|---|
| InnoDB | ✅ 支持 | ✅ 支持 | 行级锁 | ACID 事务、MVCC、聚簇索引、崩溃恢复、高并发 | 大多数 OLTP(在线事务处理)场景,如订单、账户、用户数据 |
| MyISAM | ❌ 不支持 | ❌ 不支持 | 表级锁 | 读写分离时读性能较好,占用空间小,不支持崩溃安全 | 只读或写极少的历史表、日志分析、数据仓库场景(逐渐被 InnoDB 取代) |
| Memory | ❌ 不支持 | ❌ 不支持 | 表级锁 | 数据存储在内存中,重启后丢失,查询极快 | 临时表、缓存表、会话状态等对持久性无要求的场景 |
| CSV | ❌ 不支持 | ❌ 不支持 | 表级锁 | 将数据以 CSV 格式存储,可直接被外部程序读写 | 作为数据交换格式,或从外部系统导入简单数据 |
| Archive | ❌ 不支持 | ❌ 不支持 | 行级锁 | 只支持 INSERT 和 SELECT,使用 zlib 压缩,存储空间小 | 日志存储、审计数据等写多读少、无需更新的场景 |
| NDB Cluster | ✅ 支持 | ✅ 支持(部分) | 行级锁 | 分布式内存存储,高可用、高吞吐,跨节点同步 | 对高可用性、水平扩展要求极高的电信、金融类应用 |
如何选择存储引擎?
-
首选 InnoDB
除非有非常明确的特殊需求,否则现代 MySQL 应用都应使用 InnoDB。它能满足事务、数据完整性、高并发、崩溃恢复等绝大多数业务要求。 -
何时使用 MyISAM
- 极少数情况下,如果表完全是只读或只有单线程写入,且对崩溃恢复不敏感,可以使用 MyISAM 获得稍好的读性能。
- 但在 MySQL 8.0 中,系统表已强制使用 InnoDB,MyISAM 逐渐边缘化。
-
临时表场景
- MySQL 内部会使用 Memory 或 TempTable 引擎处理复杂查询的临时表。
- 用户也可显式创建
ENGINE=MEMORY表做缓存,但要注意内存占用和数据易失性。
-
特殊数据交换
- CSV、Archive 等引擎通常作为特定工具使用,而非业务主存储。
引擎管理常用命令
sql
-- 查看当前数据库支持的引擎
SHOW ENGINES;
-- 创建表时指定引擎
CREATE TABLE t1 (id INT) ENGINE = InnoDB;
-- 修改已有表的引擎
ALTER TABLE t1 ENGINE = InnoDB;