MySQL 5.5 之前,MyISAM 引擎是 MySQL 的默认存储引擎,MySQL 5.5 版本之后,InnoDB 是 MySQL 的默认存储引擎。
(1)是否支持行级锁
MyISAM 只有表级锁,而 InnoDB 支持行级锁和表级锁,默认为行级锁。
具体的锁详情请参考阿Q的此篇文章:面试必备常见存储引擎与锁的分类,请查收
(2)是否支持事务
MyISAM 不提供事务支持,InnoDB 提供事务支持,实现了 SQL 标准定义的四个隔离级别,具有提交和回滚事务的能力。
InnoDB 默认使用的 REPEATABLE-READ(可重读)隔离级别是可以解决幻读问题发生的(基于 MVCC 和 Next-Key Lock)。
(3)是否支持外键
MyISAM 不支持,而 InnoDB 支持。
(4)是否支持数据库异常崩溃后的安全恢复
MyISAM 不支持,而 InnoDB 支持。使用 InnoDB 的数据库在异常崩溃后,数据库重新启动的时候会保证数据库恢复到崩溃前的状态。这个恢复的过程依赖于 redo log 。
(5)是否支持 MVCC
MyISAM 不支持,而 InnoDB 支持。
(6)索引实现
虽然 MyISAM 引擎和 InnoDB 引擎都是使用 B+Tree 作为索引结构,但是两者的实现方式不太一样。
InnoDB 引擎中,其数据文件本身就是索引文件。其表数据文件本身就是按 B+Tree 组织的一个索引结构,树的叶子节点 data 域保存了完整的数据记录。
MyISAM 索引文件和数据文件是分离的,索引保存的是数据文件的指针。