您现在的位置是: 网站首页 > 程序设计  > MySQL 

MyIsam和InnoDB的区别和适用场景

2020年2月6日 08:00 1497人围观

简介MySQL有MyISAM和InnoDB两种搜索引擎,那么这两种搜索引擎各有什么优点?怎么选择

1.默认引擎

在MySQL 5.1之前的版本中,默认的搜索引擎是MyISAM。
从MySQL 5.5之后的版本中,默认的搜索引擎变更为InnoDB。

2.锁的粒度

MyISAM仅支持表锁。每次操作锁住整张表。这种处理方式一方面加锁的开销比较小,且不会出现死锁,但另一方面并发性能较差。

InnoDB支持行锁。每次操作锁住一行数据,一方面行级锁在每次获取锁和释放锁的操作需要消耗比表锁更多的资源,速度较慢,且可能发生死锁,但是另一方面由于锁的粒度较小,发生锁冲突的概率也比较低,并发性较好。值得注意的是行锁是通过给索引项加锁来实现的,即只有通过索引条件检索数据,InnoDB才使用行级锁,否则将使用表锁。

3.事务

MyISAM是一种非事务性的引擎,不支持事务,使得MyISAM引擎的MySQL可以提供高速存储和检索,以及全文搜索能力,适合数据仓库等查询频繁的应用。

InnoDB支持事务,是事务安全的。事务是一种高级的处理方式,如在一些列增删改中只要哪个出错还可以回滚还原,而MyISAM就不可以了。实际上,InnoDB是一个性能良好的事务性引擎。它实现了四个标准的隔离级别,默认的隔离级别为可重复读,并通过间隙锁策略来防止幻读的出现。此外它还通过多版本并发控制来支持高并发。

4.外键

MyISAM不支持外键。
InnoDB支持外键。

5.全文索引

MyISAM支持全文索引。全文索引是指对char、varchar和text中的每个词建立倒排序索引。MyISAM的全文索引不支持中文分词,必须由使用者分词后加入空格再写到数据表里,而且少于4个汉字的词会和停用词一样被忽略掉。

InnoDB不支持全文索引。但是innodb可以使用sphinx插件支持全文索引,并且效果更好。

6.主键

MyISAM允许没有主键的表存在。
InnoDB要求必须有主键,而如果在建表时没有显示的指定主键,InnoDB就会为每一行数据自动生成一个6字节的ROWID列,并以此做为主键。这种主键对用户不可见。

7.索引

MyISAM

  • 关于主键索引,MyISAM使用B+树作为索引结构,叶子节点的data域存放的是数据记录的地址。所以MyISAM的索引被称为非聚集索引。
  • 关于辅助索引,与主键索引相同,只是辅助索引允许key值重复。

InnoDB

  • 关于主键索引,InnoDB使用B+树作为索引结构,叶子节点的data域存放的是数据本身,由于InnoDB的数据文件本身要按照主键聚集,所以InnoDB的数据表必须有主键。InnoDB的索引被称为聚集索引。
  • 关于辅助索引,InnoDB的辅助索引的data域全部为主键,若主键很大,索引就会很大。

聚集索引

聚集索引会带来更高的主键搜索效率,但辅助索引需要检索两遍索引,首先检索辅助索引获得主键,然后再通过主键到主索引获得数据。面试中常常会被问到MyISAM和InnoDB之间关于索引的区别,便是如此

8. 适用场景

MyISAM适合:

  • 做很多count 的计算,因为MyISAM内置了一个计数器,count(*)时它直接从计数器中读,而InnoDB必须扫描全表。
  • 插入不频繁,查询非常频繁,如果执行大量的SELECT,MyISAM是更好的选择;
  • 没有事务。

InnoDB适合:

  • 可靠性要求比较高,或者要求事务;
  • 表更新和查询都相当的频繁,并且表锁定的机会比较大的情况指定数据引擎的创建;
  • 如果你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表;
  • DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的 删除;
  • LOAD TABLE FROM MASTER操作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的表不适用。

总结补充

MyISAM引擎中的索引没有主次之分,所有的索引的叶子节点存放的是数据的指针,在查询的时候不需要回表,所以更快,但是插入会慢,因为要更新所有的索引结构

InnoDB引擎中的索引的索引有主次之分,而且所有辅助索引的末端存放的是主键的值,所以很多时候使用辅助索引都需要回表查询(如果查询的值就是主键,则不需要回表),插入的时候只需要更新主键索引即可,索引插入比MyISAM要快些。