InnoDB和MyISAM的的区别是什么?
-
MyISAM不支持事务,InnoDB支持事务。
-
对表行数查询的支持不同。MyISAM内置了一个计数器来存储表的行数,直接读取该计数器即可。而InnoDB不保存这些信息,执行 select count(*)需要全表扫描。当表中数据量非常大的时候速度很慢。
-
锁粒度不同。MyISAM仅支持表锁。每次操作锁住整张表,开销小且不会死锁,但并发性能较差。InnoDB支持行锁。每次操作锁住一行数据,开销大,速度较慢,且可能发生死锁,但并发性较好。此外,即使是使用了InnoDB存储引擎,但如果MySQL执行一条sql语句时不能确定要扫描的范围,也会锁住整张表。
-
对主键的要求不同。MyISAM允许没有主键的表存在。而如果在建表时没有显示的指定主键,InnoDB就会为每一行数据自动生成一个6字节的ROWID列,并以此做为主键。
-
数据和索引的组织方式不同。MyISAM将索引和数据分开进行存储,索引存放在.MYI文件中,数据存放在.MYD文件中。InnoDB的主键索引树的叶子节点保存主键和相应的数据。其它的索引树的叶子节点保存的是主键。也正是因为采取了这种存储方式,InnoDB才强制要求每张表都要有主键。
-
MyISAM崩溃后无法安全恢复,InnoDB支持崩溃后的安全恢复。InnoDB实现了一套完善的崩溃恢复机制,保证在任何状态下(包括在崩溃恢复状态下)数据库挂了,都能正常恢复。
-
缓存机制不同。MyISAM仅缓存索引信息,而不缓存实际的数据信息。而InnoDB不仅缓存索引信息,还会缓存数据信息。其将数据文件按页读取到缓冲池,然后按最近最少使用的算法来更新数据。
-
MyISAM 必须依靠操作系统来管理读取与写入的缓存,而 InnoDB 则是有自己的读写缓存管理机制。( InnoDB 不会将被修改的数据页立即交给操作系统)因此在某些情况下,InnoDB 的数据访问会比 MyISAM 更有效率。参考:zhuanlan.zhihu.com/p/134669835
-
MyISAM不支持外键,InnoDB支持外键。
如何选择存储引擎?
- MyISAM 管理非事务表。它提供高速存储和检索,以及全文搜索能力。如果应用中需要执行大量的 SELECT 查询,那么 MyISAM 是更好的选择。(读多写少)
- InnoDB 用于事务处理应用程序,具有众多特性,包括 ACID 事务支持。如果应用中需要执行大量的 INSERT 或 UPDATE 操作,则应该使用 InnoDB,这样可以提高多用户并发操作的性能。(读少写多)