innodb支持acid事务、行级锁、崩溃自动恢复及事务安全的全文索引,myisam不支持事务、仅表级锁、无日志恢复机制且全文索引不可回滚,高并发强一致性场景必须用innodb。

事务支持:InnoDB 支持,MyISAM 不支持
这是最根本的差异。InnoDB 是 MySQL 中唯一默认支持 ACID 事务的存储引擎,START TRANSACTION、COMMIT、ROLLBACK 都能正常工作;而 MyISAM 所有写操作都是自动提交的,没有回滚能力。
如果你的应用需要转账、库存扣减、订单状态变更等强一致性场景,必须用 InnoDB。MyISAM 在这类业务中一旦出错(比如中间断电),数据很可能处于不一致状态,且无法恢复。
- MyISAM 的
INSERT、UPDATE、DELETE操作是表级锁定,且不可回滚 - InnoDB 默认使用行级锁,配合事务可精确控制并发修改范围
- 执行
SHOW ENGINE INNODB STATUS可查看当前事务和锁等待情况;MyISAM 没有对应命令
锁机制:行锁 vs 表锁
InnoDB 默认在有索引条件下使用行级锁,只锁住被操作的记录;MyISAM 无论什么操作,都是整张表加锁。
这意味着高并发写入时,MyISAM 容易成为瓶颈。例如一个后台任务在 UPDATE 一张百万行的 MyISAM 表,哪怕只改一行,其他所有对该表的读写请求都会排队等待。
本书将PHP开发与MySQL应用相结合,分别对PHP和MySQL做了深入浅出的分析,不仅介绍PHP和MySQL的一般概念,而且对PHP和MySQL的Web应用做了较全面的阐述,并包括几个经典且实用的例子。 本书是第4版,经过了全面的更新、重写和扩展,包括PHP5.3最新改进的特性(例如,更好的错误和异常处理),MySQL的存储过程和存储引擎,Ajax技术与Web2.0以及Web应用需要注意的安全
- InnoDB 的行锁依赖索引:如果
WHERE条件未命中索引,会退化为表锁 - MyISAM 的表锁分读锁(
READ)和写锁(WRITE),读写互斥 - 可通过
SHOW OPEN TABLES WHERE In_use > 0查看 MyISAM 表是否被锁住
崩溃恢复与数据安全
InnoDB 有重做日志(ib_logfile0、ib_logfile1)和双写缓冲(doublewrite),崩溃后能自动前滚恢复;MyISAM 没有日志机制,靠 myisamchk 工具修复,但可能丢数据或损坏索引。
线上环境若未开启 innodb_flush_log_at_trx_commit = 1,极端情况下仍可能丢失最近一秒事务;而 MyISAM 即使配置了 sync_binlog = 1,也无法保证单语句原子性。
- InnoDB 启动时自动执行 crash recovery,无需人工干预
- MyISAM 表损坏后,
REPAIR TABLE可能失败,尤其在无备份时风险极高 - MyISAM 的
.MYI索引文件损坏比.MYD数据文件更常见,且不易察觉
全文索引与空间索引支持
MySQL 5.6 起,InnoDB 开始支持 FULLTEXT 索引;5.7 起支持 SPATIAL 索引。MyISAM 很早就支持这两类索引,但功能较旧,比如不支持中文分词(需配合第三方插件)。
不过要注意:InnoDB 的全文索引是事务安全的,增删改会随事务一起提交或回滚;MyISAM 的全文索引更新是立即生效的,无法回滚。
- 创建 InnoDB 全文索引:
ALTER TABLE articles ADD FULLTEXT(title, content);
- MyISAM 全文索引对停用词(如“the”、“and”)敏感,默认最小词长为 4,需调
ft_min_word_len - InnoDB 的
MATCH ... AGAINST查询性能在大数据量下略低于 MyISAM,但差距已大幅缩小
ENGINE=InnoDB,只要 MySQL 5.5+ 且未显式修改 default_storage_engine,新表也会默认用 InnoDB —— 但老脚本或迁移数据时,CREATE TABLE ... SELECT 可能继承源表引擎,这点常被漏查。









