事务支持: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 表,哪怕只改一行,其他所有对该表的读写请求都会排队等待。 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_lenInnoDB 的
MATCH ... AGAINST查询性能在大数据量下略低于 MyISAM,但差距已大幅缩小 MyISAM 现在基本只适合极低并发、只读为主、且能接受手动维护的场景,比如日志归档表或报表缓存表;InnoDB 是绝大多数业务的默认且合理选择。真正容易被忽略的是:即使你建表时没指定
ENGINE=InnoDB,只要 MySQL 5.5+ 且未显式修改
default_storage_engine,新表也会默认用 InnoDB —— 但老脚本或迁移数据时,
CREATE TABLE ... SELECT可能继承源表引擎,这点常被漏查。
