MySQL存储引擎 MyISAM 和 InnoDB 区别总结整理

  1. MySQL默认存储引擎的变迁

    由 MyISAM 变为 InnoDB

  2. 区别

    • MyISAM不支持事务,InnoDB支持事务。由于MyISAM在很长一段时间内是MySQL的默认存储引擎,所以在很多人的印象中MySQL是不支持事务的数据库。实际上,InnoDB是一个性能良好的事务性引擎。它实现了四个标准的隔离级别,默认的隔离级别为可重复读(REPEATABLE READ),并通过间隙锁策略来防止幻读的出现。此外它还通过多版本并发控制(MVCC)来支持高并发。
    • 对表的行数查询的支持不同。MyISAM内置了一个计数器来存储表的行数。执行 select count() 时直接从计数器中读取,速度非常快。而InnoDB不保存这些信息,执行 select count() 需要全表扫描。当表中数据量非常大的时候速度很慢。
    • 锁的粒度不同。MyISAM仅支持表锁。每次操作锁住整张表。这种处理方式一方面加锁的开销比较小,且不会出现死锁,但另一方面并发性能较差。InnoDB支持行锁。每次操作锁住一行数据,一方面行级锁在每次获取锁和释放锁的操作需要消耗比表锁更多的资源,速度较慢,且可能发生死锁,但是另一方面由于锁的粒度较小,发生锁冲突的概率也比较低,并发性较好。此外,即使是使用了InnoDB存储引擎,但如果MySQL执行一条sql语句时不能确定要扫描的范围,也会锁住整张表。
    • 对主键的要求不同。MyISAM允许没有主键的表存在。而如果在建表时没有显示的指定主键,InnoDB就会为每一行数据自动生成一个6字节的ROWID列,并以此做为主键。这种主键对用户不可见。InnoDB对主键采取这样的策略是与它的数据和索引的组织方式有关的,下文会讲到。
    • 数据和索引的组织方式不同。MyISAM将索引和数据分开进行存储。索引存放在.MYI文件中,数据存放在.MYD文件中。索引中保存了相应数据的地址。以表名+.MYI文件分别保存。 InnoDB的主键索引树的叶子节点保存主键和相应的数据。其它的索引树的叶子节点保存的是主键。也正是因为采取了这种存储方式,InnoDB才强制要求每张表都要有主键。
    • 对AUTO_INCREMENT的处理方式不一样。如果将某个字段设置为AUTO_INCREMENT,InnoDB中规定必须包含只有该字段的索引。但是在MyISAM中,也可以将该字段和其他字段一起建立联合索引。
    • delete from table的处理方式不一样。MyISAM会重新建立表。InnoDB不会重新建立表,而是一行一行的删除。因此速度非常慢。推荐使用truncate table,不过需要用户有drop此表的权限。
    • MyISAM崩溃后无法安全恢复,InnoDB支持崩溃后的安全恢复。InnoDB实现了一套完善的崩溃恢复机制,保证在任何状态下(包括在崩溃恢复状态下)数据库挂了,都能正常恢复。
    • MyISAM不支持外键,InnoDB支持外键
    • 缓存机制不同。MyISAM仅缓存索引信息,而不缓存实际的数据信息。而InnoDB不仅缓存索引信息,还会缓存数据信息。其将数据文件按页读取到缓冲池,然后按最近最少使用的算法来更新数据。

猜你喜欢

转载自blog.csdn.net/weixin_33672109/article/details/91383529