MyISAM与InnoDB的异同

MyISAM与InnoDB的异同

一、引言

存储引擎是MySQL三层架构中的最下面的一层,负责数据的存储和提取,也是MySQL的核心所在。存储引擎提供统一的API供上层调用。虽然对上层提供的API是统一的,但是不同的存储引擎有不同的实现方式。每个存储引擎都有各自的侧重点,从而各有优缺点。

在MySQL 5.5版本前,默认的存储引擎为MyISAM。在那之后MySQL的默认存储引擎改为InnoDB。这两个存储引擎都是非常经典的存储引擎,因此在面试中也被经常拿来做对比。这两个存储引擎既有很多的不同点,但是也有一些相同点。下面详细介绍一下。

二、 MyISAM与InnoDB的不同点

  1. MyISAM不支持事务,InnoDB支持事务。由于MyISAM在很长一段时间内是MySQL的默认存储引擎,所以在很多人的印象中MySQL是不支持事务的数据库。实际上,InnoDB是一个性能良好的事务性引擎。它实现了四个标准的隔离级别,默认的隔离级别为可重复读(REPEATABLE READ),并通过间隙锁策略来防止幻读的出现。此外它还通过多版本并发控制(MVCC)来支持高并发。

  2. 对表的行数查询的支持不同。MyISAM内置了一个计数器来存储表的行数。执行 select count() 时直接从计数器中读取,速度非常快。而InnoDB不保存这些信息,执行 select count()需要全表扫描。当表中数据量非常大的时候速度很慢。

  3. 锁的粒度不同。MyISAM仅支持表锁。每次操作锁住整张表。这种处理方式一方面加锁的开销比较小,且不会出现死锁,但另一方面并发性能较差。InnoDB支持行锁。每次操作锁住一行数据,一方面行级锁在每次获取锁和释放锁的操作需要消耗比表锁更多的资源,速度较慢,且可能发生死锁,但是另一方面由于锁的粒度较小,发生锁冲突的概率也比较低,并发性较好。此外,即使是使用了InnoDB存储引擎,但如果MySQL执行一条sql语句时不能确定要扫描的范围,也会锁住整张表。

  4. 对主键的要求不同。MyISAM允许没有主键的表存在。而如果在建表时没有显示的指定主键,InnoDB就会为每一行数据自动生成一个6字节的ROWID列,并以此做为主键。这种主键对用户不可见。InnoDB对主键采取这样的策略是与它的数据和索引的组织方式有关的,下文会讲到。

  5. 数据和索引的组织方式不同。MyISAM将索引和数据分开进行存储。索引存放在.MYI文件中,数据存放在.MYD文件中。索引中保存了相应数据的地址。以表名+.MYI文件分别保存。 InnoDB的主键索引树的叶子节点保存主键和相应的数据。其它的索引树的叶子节点保存的是主键。也正是因为采取了这种存储方式,InnoDB才强制要求每张表都要有主键。

  6. 对AUTO_INCREMENT的处理方式不一样。如果将某个字段设置为INCREMENT,InnoDB中规定必须包含只有该字段的索引。但是在MyISAM中,也可以将该字段和其他字段一起建立联合索引。

  7. delete from table的处理方式不一样。MyISAM会重新建立表。InnoDB不会重新建立表,而是一行一行的删除。因此速度非常慢。推荐使用truncate table,不过需要用户有drop此表的权限。

  8. MyISAM崩溃后无法安全恢复,InnoDB支持崩溃后的安全恢复。InnoDB实现了一套完善的崩溃恢复机制,保证在任何状态下(包括在崩溃恢复状态下)数据库挂了,都能正常恢复。

  9. MyISAM不支持外键,InnoDB支持外键。

  10. 缓存机制不同。MyISAM仅缓存索引信息,而不缓存实际的数据信息。而InnoDB不仅缓存索引信息,还会缓存数据信息。其将数据文件按页读取到缓冲池,然后按最近最少使用的算法来更新数据。

三、 MyISAM和InnoDB的相同点

  1. 两者都仅支持B+树索引,不支持hash索引。InnoDB中有一种自适应哈希索引的机制。其会根据表的使用情况自动的为表生成哈希索引。但这是不能认为干预的。所以也可以认为InnoDB不支持哈希索引。

  2. 都支持全文索引。MySQL5.6版本后 innodb 已经支持全文索引了。并且在5.7版本之后支持中文的全文索引。

四、 总结

MyISAM和InnoDB都是MySQL非常经典的存储引擎。本文详细对比了两者的异同点。总体来说,MyISAM只适合一些数据量小的,对并发和事务等没有要求的场景。而大部分场景都最好默认使用InnoDB存储引擎。

五、 参考

在对MyISAM和InnoDB的知识点总结过程中,本文参考了一些优秀的博客与书籍。列表如下:

  1. https://www.cnblogs.com/vicenteforever/articles/1613119.html
  2. https://www.cnblogs.com/ijia/p/3826990.html
  3. https://www.cnblogs.com/changna1314/p/6878900.html
  4. https://blog.csdn.net/perfectsorrow/article/details/80150672
  5. https://www.cnblogs.com/zhangchaoyang/articles/4214237.html
  6. https://www.cnblogs.com/y-rong/p/8110596.html
  7. https://www.cnblogs.com/coderyuhui/p/7191413.html
  8. https://www.jianshu.com/p/645402711dac
  9. 《高性能MySQl》(第三版)
  10. 《MySQL技术内幕:InnoDB存储引擎》

欢迎关注个人公众号!
这里写图片描述

微信交流群
在这里插入图片描述

你可能感兴趣的:(mysql,mysql,存储引擎,innodb,myisam,java)