InnoDB
- 支持事务, InnoDB实现了四个标准的隔离级别,默认级别是REPEATABLE READ(可重复读)
- 支持行锁和表锁
- 表基于聚簇索引创建
- .frm文件存储表结构, .ibd文件存储索引和数据
- 支持外键
- 不保存表的具体行数,当没有合适的索引时,select count(*) 需要扫描整个表
- 通过MVCC支持高并发
MyISAM
- 不支持事务
- 只支持表锁,不支持行锁,一个更新语句会锁住整张表,会导致其他查询和更新阻塞,效率低
- 崩溃后无法安全恢复
- .frm文件存储表结构, .MYD存储数据文件, .MYI存储索引文件
- 存储表的具体行数
- 支持全文索引,即使时BLOB和TEXT等长字段,也可以基于前500个字符创建索引
- 不支持外键
如何选择
-
是否需要支持事务
如果应用需要支持事务,那么InnoDB时目前最稳定并且经过验证的选择,如果不需要支持事务,并且主要时select和insert操作,那么MyISAM是不错的选择
-
备份
备份需求也会影响存储引擎选择,如果需要在线热备份,那么选择InnoDB是最基本的要求
-
崩溃恢复
MyISAM崩溃后发生损坏的概率比InnoDB要高很多,而且恢复速度也要慢,因此即使不需要使用事务支持,也有很多人选择InnoDB引擎,这是一个最主要的因素
-
特有的特性
有些应用可能以来存储引擎的特性,比如很多应用以来聚簇索引的优化,另外,MySQL只有MyISAM支持地理空间搜索,应该综合考虑各个存储引擎的特性来进行选择