Mysql InnoDB 和 MyISAM 的区别

InnoDB和MyISAM是许多人在使用MySQL时最经常使用的两个表类型,这两个表类型各有优劣,视具体应用而定。数据库

基本的差异为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,可是不提供事务支持,而 InnoDB提供事务支持已经外部键等高级数据库功能。 并发

如下是一些细节和具体实现的差异:
1.InnoDB不支持FULLTEXT类型的索引。
2.InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from table时,InnoDB要扫描一遍整个表来计算有多少行,可是MyISAM只要简单的读出保存好的行数便可。注意的是,当count(*)语句包含 where条件时,两种表的操做是一3.对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,可是在MyISAM表中,能够和其余字段一块儿创建联合索引。
4.DELETE FROM table时,InnoDB不会从新创建表,而是一行一行的删除。
5.LOAD TABLE FROM MASTER操做对InnoDB是不起做用的,解决方法是首先把InnoDB表改为MyISAM表,导入数据后再改为InnoDB表,可是对于使用的额外的InnoDB特性(例如外键)的表不适用。
另外,InnoDB表的行锁也不是绝对的,假如在执行一个SQL语句时MySQL不能肯定要扫描的范围,InnoDB表一样会锁全表,例如update table set num=1 where name like “%aaa%” 性能

在实际应用中,MyISAM不必定比InnoDB快,缘由以下:spa

MyISAM采用的是表级锁和读乐观锁,也便是在有读操做时,全部对同个表的操做将被阻塞等待读操做完成,反则亦然,多个写操做之间也会胡星排斥。然而多个读操做读取同个表时不会互相排斥,因此在这种读多写少的场景下MyISAM比使用多版本控制的行级所的InnoDB表现的性能要好。版本控制

InnoDB采用的是多版本行级锁,所谓多版本行级锁,简单的来说就是InnoDB会为没行记录增长一个相似于版本库的队列,读操做获取到的是当前操做的版本的上一个版本,保证读取到的内容是上一次操做保存好的数据,在写操做的时候会锁定当前版本的数据行,完毕后该数据行的版本加1。这样,在写和更新某一行记录的时候才加锁,读的是上一版本的数据,从而给读写都频繁的场景下提供了更高的并发性。索引

相关文章
相关标签/搜索