InnoDB 和 MyISAM 的区别?

5 阅读4分钟

可以从 事务、锁、崩溃恢复、索引、性能适用场景 这几个角度来回答。

1. 核心区别概览

InnoDB

MySQL 默认存储引擎(现代版本里基本都是它),特点是:

  • 支持 事务
  • 支持 行级锁
  • 支持 MVCC
  • 支持 外键
  • 支持 崩溃恢复
  • 更适合 高并发、读写混合、数据安全要求高 的业务

MyISAM

MySQL 早期常见存储引擎,特点是:

  • 不支持事务
  • 不支持行锁,主要是 表级锁
  • 不支持外键
  • 崩溃恢复能力较弱
  • 某些纯读场景下历史上性能不错
  • 更适合 读多写少、对事务要求不高 的简单场景,但现在实际生产中已经很少作为主力引擎

2. 详细对比

(1)事务支持

InnoDB 支持事务,可以做到:

  • BEGIN
  • COMMIT
  • ROLLBACK

这意味着一组操作要么都成功,要么都失败,满足 ACID。

MyISAM 不支持事务
一旦执行写入,出错时无法回滚。

例子:
转账业务里:

  • A 账户扣钱成功
  • B 账户加钱失败

InnoDB 可以回滚;MyISAM 不行,容易造成数据不一致。


(2)锁机制

InnoDB 支持行级锁,并发能力强。
多个事务更新不同行时,可以并行执行。

MyISAM 主要是表级锁
一个线程写表时,整个表都会被锁住,其他线程读写都会受影响。

所以:

  • InnoDB 更适合高并发更新
  • MyISAM 在写多场景下容易产生锁竞争

(3)MVCC

InnoDB 支持 MVCC(多版本并发控制) ,在可重复读、读已提交等隔离级别下,普通查询和写操作可以更好地并发执行。

MyISAM 不支持 MVCC

这也是为什么 InnoDB 在 OLTP 场景下表现更好。


(4)外键支持

InnoDB 支持外键约束,可以保证关联数据的一致性。
MyISAM 不支持外键

不过很多互联网项目即使用 InnoDB,也常在业务层控制关联关系,而不是大量依赖数据库外键。


(5)崩溃恢复

InnoDB 有 redo log / undo log,数据库异常宕机后,能通过日志做恢复,保证已提交数据尽量不丢失,未完成事务可回滚。

MyISAM 崩溃恢复能力较差,表损坏后可能需要手工修复,可靠性不如 InnoDB。

所以在正式生产环境里,InnoDB 的安全性明显更高


(6)索引结构

InnoDB

  • 主键索引是 聚簇索引
  • 数据本身就存储在主键索引叶子节点上
  • 二级索引叶子节点保存的是 主键值

所以 InnoDB 通过二级索引查询后,通常还需要“回表”到主键索引取完整数据。

MyISAM

  • 索引和数据是分开存储的
  • 主键索引不是聚簇索引
  • 索引叶子节点直接存储数据文件地址

这属于底层存储结构上的重要差异。


(7)COUNT(*) 性能

这是经典面试题。

MyISAM 对 count(*) 更快,因为它会直接保存表的总行数。
执行 select count(*) from table 时,通常可以直接返回。

InnoDB 不会保存一个绝对精确的总行数,因为事务并发下不同事务看到的行数可能不同,所以通常需要扫描统计。

所以:

  • where 条件下,MyISAM 的 count(*) 往往更快
  • 但这是建立在它不支持事务和一致性视图较弱的基础上

(8)存储文件

MyISAM
通常对应 3 个文件:

  • .frm:表结构
  • .MYD:数据文件
  • .MYI:索引文件

InnoDB
结构更复杂,涉及:

  • 表空间文件
  • redo log
  • undo log
  • ibdata / ibd 等

说明 InnoDB 设计更偏向事务型数据库能力。


3. 如何理解两者的使用场景

适合 InnoDB 的场景

  • 电商订单
  • 支付交易
  • 用户系统
  • 库存系统
  • 高并发读写系统
  • 任何对数据一致性要求高的业务

适合 MyISAM 的场景

理论上可用于:

  • 纯读或读多写少
  • 临时性、历史遗留系统
  • 对事务和崩溃恢复要求不高的数据

但现在大多数生产系统,优先都是 InnoDB


4. 总结

InnoDB 强调事务安全、并发能力和数据可靠性;MyISAM 强调简单和早期某些读场景性能,但现代业务中主流选择基本都是 InnoDB。


5. 背诵版

InnoDB 和 MyISAM 的主要区别有:

  1. InnoDB 支持事务,MyISAM 不支持事务
  2. InnoDB 支持行级锁,MyISAM 主要是表级锁
  3. InnoDB 支持 MVCC,适合高并发;MyISAM 不支持
  4. InnoDB 支持外键,MyISAM 不支持
  5. InnoDB 支持崩溃恢复,数据安全性更高;MyISAM 较弱
  6. InnoDB 是聚簇索引,MyISAM 是非聚簇索引
  7. MyISAM 在无条件 count(*) 上通常更快
  8. 生产环境里大多数核心业务表都优先使用 InnoDB