MyISAM和InnoDB如何选择?

84 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第4天,点击查看活动详情

MySQL 5.5之前(MySQL5.1下一个版本就是5.5),MyISAM引擎是MySQL的默认存储引擎,5.5版本之后,MySQL彻底使用了新版InnoDB(其中也是Oracle收购了Sun公司之后发布的),MySQL5.5版本后默认的存储引擎为InnoDB。

1、是否支持行级锁 MyISAM只有表级锁,而InnoDB支持行级锁和表级锁,默认为行级锁。 也就是说,MyISAM一锁就是锁住整张表,这在并发的情况下是多么滴憨批,这也是为什么InnoDB在并发写的时候,性能更牛皮了!

2、是否支持事务 MyISAM 不提供事务支持。 InnoDB提供事务支持,具有提交(commit)和回滚(rollback)事务的能力。

3、是否支持外键 MyISAM不支持,而InnoDB支持。 一般我们也是不建议在数据库层面使用外键的,应用层面可以解决,不过,这样会对数据的一致性造成威胁。具体要不要使用外键还是要根据你的项目来决定。

4、是否支持数据库异常崩溃后的安全恢复 MyISAM不支持,InnoDB支持。 使用InnoDB的数据库在异常崩溃后,数据库重新启动的时候会保证数据库恢复到崩溃前的状态,这个恢复的过程依赖与redo log

5、是否支持MVCC MyISAM不支持,而InnoDB支持。 MVCC可以看作是行级锁的一个升级,可以有效减少加锁操作,提供性能,而MyISAM连行级锁都不支持。

关于MyISAM和InnoDB的选择问题 《MySQL 高性能》上面有一句话这样写到: 不要轻易相信“MyISAM比InnoDB快”这类的经验之谈,这个结论往往不是绝对。在很多我们已知场景中,InnoDB的速度都可以让MyISAM望尘莫及,尤其是用到了聚簇索引,或者需要访问的数据都可以放入内存的应用。

所以一般情况我么选择InnoDB都是没有问题的,但是某些情况下你并不在乎可扩展能力和并发能力,也不需要事务支持,也不在乎崩溃后的安全恢复的话,选择MyISAM也是一个不错的选择。但是一般情况下,我们都是需要考虑到这些问题的。