搜索 K
Appearance
在 MySQL 中,常见的两种存储引擎是:
InnoDB(MySQL 默认,支持事务,使用 B+树)
MyISAM(老版本默认,轻量级,不支持事务)
下面我将从多个维度详细对比这两种存储引擎的区别:
| 特性 | InnoDB | MyISAM |
|---|---|---|
| 是否默认引擎 | ✅ 是(从 MySQL 5.5 开始) | ❌ 否(MySQL 5.5 以前默认) |
| 支持事务 | ✅ 支持(ACID) | ❌ 不支持 |
| 支持外键 | ✅ 支持 | ❌ 不支持 |
| 锁机制 | 行级锁(高并发) | 表级锁(低并发) |
| 缓存机制 | 缓存索引 + 数据 | 只缓存索引 |
| 存储结构 | 聚簇索引(数据与主键一起存储) | 非聚簇索引(数据与索引分离) |
| 数据安全性 | 崩溃后数据恢复能力强 | 崩溃后容易损坏,需要修复 |
| 支持全文索引 | 5.6 开始支持(InnoDB) | ✅ 原生支持 |
| 插入删除性能 | 稍慢(需维护事务和一致性) | 快(简单的插入删除) |
| 功能 | InnoDB | MyISAM |
|---|---|---|
| 事务支持 | ✅ 完整支持(BEGIN, COMMIT, ROLLBACK) | ❌ 不支持 |
| 外键约束 | ✅ 支持 FOREIGN KEY | ❌ 不支持 |
| 锁粒度 | 行级锁(支持并发) | 表级锁(加锁整张表) |
| MVCC(多版本并发控制) | ✅ 支持(提升并发读性能) | ❌ 不支持 |
| 崩溃恢复 | ✅ 自动恢复,采用重做日志(Redo Log) | ❌ 需要手动修复(如 myisamchk) |
| 缓存策略 | 缓存数据页和索引页(Buffer Pool) | 只缓存索引块(Key Cache) |
| 表空间 | 独立表空间或共享表空间 | 每张表生成 .MYD(数据)和 .MYI(索引)文件 |
| 全文索引 | MySQL 5.6+ 开始支持(需开启) | ✅ 原生支持 |
| 适合场景 | 事务、高并发、数据一致性要求高的系统 | 读多写少、数据量中等的网站类应用 |
| 主键设计 | 强依赖主键,必须有主键或唯一键 | 可以没有主键 |
| 压缩表支持 | ✅ 支持 | ❌ 不支持 |
| 文件类型 | InnoDB | MyISAM |
|---|---|---|
| 数据文件 | .ibd(或共享表空间 .ibdata) | .MYD |
| 索引文件 | 同 .ibd 文件或共享表空间 | .MYI |
| 表定义文件 | .frm(所有引擎共用) | .frm |
| 场景 | InnoDB 表现 | MyISAM 表现 |
|---|---|---|
| 读性能(简单查询) | 略慢(行锁 + MVCC) | 更快(结构简单) |
| 写性能(并发写) | 更强(行锁+事务) | 较差(表锁,阻塞) |
| 大表支持 | 更适合处理大数据量 | 不适合大表写入(重建索引慢) |
| 崩溃恢复 | 快速恢复,无需人工干预 | 恢复慢,可能数据损坏 |
| 全文索引 | 支持,但性能不如 MyISAM | 性能更好,原生支持 |
| 场景 | 建议使用 |
|---|---|
| 需要事务支持,如银行系统、电商平台 | ✅ InnoDB |
| 大量并发写入、更新操作 | ✅ InnoDB(行锁更优) |
| 主要是读操作,数据不频繁变动 | ✅ MyISAM |
| 临时表、大批量导入导出 | ✅ MyISAM(写入快) |
| 外键依赖复杂的业务模型 | ✅ InnoDB |
| 占用空间敏感 | ✅ InnoDB(可压缩表) |
-- 创建 InnoDB 表
CREATE TABLE test_innodb (
id INT PRIMARY KEY,
name VARCHAR(50)
) ENGINE=InnoDB;
-- 创建 MyISAM 表
CREATE TABLE test_myisam (
id INT PRIMARY KEY,
name VARCHAR(50)
) ENGINE=MyISAM;
-- 修改已有表为 InnoDB
ALTER TABLE test_myisam ENGINE = InnoDB;| 特性 | InnoDB | MyISAM |
|---|---|---|
| 是否支持事务 | ✅ 是 | ❌ 否 |
| 锁机制 | 行级锁 | 表级锁 |
| 崩溃恢复能力 | 强(自动) | 弱(需手动) |
| 外键支持 | ✅ 是 | ❌ 否 |
| 数据缓存 | 数据 + 索引 | 仅索引 |
| 适合场景 | 写多读多 | 读多写少 |
| 索引结构 | B+树 | B+树 |
| 默认引擎(MySQL 5.5+) | ✅ 是 | ❌ 否 |