先选对存储引擎再谈事务:innodb支持事务并维护redo/undo日志、行级锁和聚簇索引,开销高于myisam;myisam不支持事务,强行使用start transaction等语句无效。
存储引擎决定事务能否存在,事务机制的开销是在存储引擎之上的——所以先选对存储引擎,再谈事务怎么用。InnoDB 支持事务,MyISAM 不支持;用 MyISAM 强行套事务逻辑,只会让 START TRANSACTION 和 COMMIT 变成无效空操作,还误以为自己“有事务保障”。
为什么 InnoDB 的事务开销比 MyISAM 高
InnoDB 在每次写操作中要维护:redo log(保证崩溃恢复)、undo log(支持回滚和 MVCC)、行级锁结构、聚簇索引组织方式。而 MyISAM 只做表级锁 + 简单的磁盘文件追加。
- 一个
UPDATE在 InnoDB 中可能触发:索引页分裂、缓冲池刷脏、日志刷盘、锁等待检测 - 同样语句在 MyISAM 中只是:获取表锁 → 修改 .MYD 文件 → 释放锁
- 高并发写场景下,InnoDB 的
innodb_flush_log_at_trx_commit设置会显著影响吞吐(设为 2 比 1 快 3–5 倍,但掉电可能丢 1s 日志)
事务隔离级别对性能的实际影响点
不是“级别越高越慢”,而是 READ COMMITTED 和 REPEATABLE READ 在 InnoDB 中实现方式不同,直接影响 undo log 保留时长和一致性读路径。