Skip to content

在 MySQL 中,常见的两种存储引擎是:

InnoDB(MySQL 默认,支持事务,使用 B+树)

MyISAM(老版本默认,轻量级,不支持事务)

下面我将从多个维度详细对比这两种存储引擎的区别:

1. 基本概述

特性InnoDBMyISAM
是否默认引擎✅ 是(从 MySQL 5.5 开始)❌ 否(MySQL 5.5 以前默认)
支持事务✅ 支持(ACID)❌ 不支持
支持外键✅ 支持❌ 不支持
锁机制行级锁(高并发)表级锁(低并发)
缓存机制缓存索引 + 数据只缓存索引
存储结构聚簇索引(数据与主键一起存储)非聚簇索引(数据与索引分离)
数据安全性崩溃后数据恢复能力强崩溃后容易损坏,需要修复
支持全文索引5.6 开始支持(InnoDB)✅ 原生支持
插入删除性能稍慢(需维护事务和一致性)快(简单的插入删除)

2. 功能对比

功能InnoDBMyISAM
事务支持✅ 完整支持(BEGIN, COMMIT, ROLLBACK)❌ 不支持
外键约束✅ 支持 FOREIGN KEY❌ 不支持
锁粒度行级锁(支持并发)表级锁(加锁整张表)
MVCC(多版本并发控制)✅ 支持(提升并发读性能)❌ 不支持
崩溃恢复✅ 自动恢复,采用重做日志(Redo Log)❌ 需要手动修复(如 myisamchk
缓存策略缓存数据页和索引页(Buffer Pool)只缓存索引块(Key Cache)
表空间独立表空间或共享表空间每张表生成 .MYD(数据)和 .MYI(索引)文件
全文索引MySQL 5.6+ 开始支持(需开启)✅ 原生支持
适合场景事务、高并发、数据一致性要求高的系统读多写少、数据量中等的网站类应用
主键设计强依赖主键,必须有主键或唯一键可以没有主键
压缩表支持✅ 支持❌ 不支持

3. 文件结构对比

文件类型InnoDBMyISAM
数据文件.ibd(或共享表空间 .ibdata.MYD
索引文件.ibd 文件或共享表空间.MYI
表定义文件.frm(所有引擎共用).frm

4. 性能对比

场景InnoDB 表现MyISAM 表现
读性能(简单查询)略慢(行锁 + MVCC)更快(结构简单)
写性能(并发写)更强(行锁+事务)较差(表锁,阻塞)
大表支持更适合处理大数据量不适合大表写入(重建索引慢)
崩溃恢复快速恢复,无需人工干预恢复慢,可能数据损坏
全文索引支持,但性能不如 MyISAM性能更好,原生支持

5. 使用建议

场景建议使用
需要事务支持,如银行系统、电商平台InnoDB
大量并发写入、更新操作InnoDB(行锁更优)
主要是读操作,数据不频繁变动MyISAM
临时表、大批量导入导出MyISAM(写入快)
外键依赖复杂的业务模型InnoDB
占用空间敏感InnoDB(可压缩表)

6. 切换存储引擎示例

sql
-- 创建 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;

7. 总结对比

特性InnoDBMyISAM
是否支持事务✅ 是❌ 否
锁机制行级锁表级锁
崩溃恢复能力强(自动)弱(需手动)
外键支持✅ 是❌ 否
数据缓存数据 + 索引仅索引
适合场景写多读多读多写少
索引结构B+树B+树
默认引擎(MySQL 5.5+)✅ 是❌ 否