MySQL数据库之MyISAM与InnoDB的区别

MySQL数据库之MyISAM与InnoDB的区别
从如下几个方面:

一、存储结构 
每一个MyISAM在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。 
.frm文件存储表定义。 
数据文件的扩展名为.MYD (MYData)。 
索引文件的扩展名是.MYI (MYIndex)。mysql

二、存储空间 
MyISAM:可被压缩,存储空间较小。 
InnoDB:须要更多的内存和存储,它会在主内存中创建其专用的缓冲池用于高速缓冲数据和索引。 
MyISAM的索引和数据是分开的,而且索引是有压缩的,内存使用率就对应提升了很多。能加载更多索引,而Innodb是索引和数据是紧密捆绑的,没有使用压缩从而会形成Innodb比MyISAM体积庞大不小sql

三、事务处理 
MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,可是不支持外键、不提供事务支持。 
InnoDB提供事务支持事务,外部键(foreign key)等高级数据库功能。数据库

SELECT、UPDATE、INSERT、Delete操做 
若是执行大量的SELECT,MyISAM是更好的选择。 
若是你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表。 
DELETE FROM table时,InnoDB不会从新创建表,而是一行一行的删除。而MyISAM则是从新创建表。在innodb上若是要清空保存有大量数据的表,最好使用truncate table这个命令。架构

AUTO_INCREMENT 
MyISAM:能够和其余字段一块儿创建联合索引。引擎的自动增加列必须是索引,若是是组合索引,自动增加能够不是第一列,他能够根据前面几列进行排序后递增。 
InnoDB:InnoDB中必须包含只有该字段的索引。引擎的自动增加列必须是索引,若是是组合索引也必须是组合索引的第一列。并发

四、表的具体行数 
MyISAM:保存有表的总行数,若是select count(*) from table;会直接取出该值。 
InnoDB:没有保存表的总行数,若是使用select count(*) from table;就会遍历整个表,消耗至关大,可是在加了where后,myisam和innodb处理的方式都同样。高并发

五、全文索引 
MyISAM:支持 FULLTEXT类型的全文索引。不支持中文。 
InnoDB:不支持FULLTEXT类型的全文索引,可是innodb可使用sphinx插件支持全文索引,而且效果更好。性能

六、表锁差别 
MyISAM:只支持表级锁,只支持表级锁,用户在操做myisam表时,select,update,delete,insert语句都会给表自动加锁。 
InnoDB:支持事务和行级锁,是innodb的最大特点。行锁大幅度提升了多用户并发操做的新能。可是InnoDB的行锁也不是绝对的,若是在执行一个SQL语句时MySQL不能肯定要扫描的范围,InnoDB表一样会锁全表, 例如update table set num=1 where name like “%aaa%”网站

通常来讲: 
MyISAM适合: 
(1)作不少count 的计算; 
(2)插入不频繁,查询很是频繁; 
(3)没有事务。 
InnoDB适合: 
(1)可靠性要求比较高,或者要求事务; 
(2)表更新和查询都至关的频繁,而且表锁定的机会比较大的状况。spa

 两种类型最主要的差异就是Innodb 支持事务处理与外键和行级锁。而MyISAM不支持.因此MyISAM每每就容易被人认为只适合在小项目中使用。.net

  做为使用MySQL的用户角度出发,Innodb和MyISAM都是比较喜欢的,若是数据库平台要达到需求:99.9%的稳定性,方便的扩展性和高可用性来讲的话,MyISAM绝对是首选。

  缘由以下:

  一、平台上承载的大部分项目是读多写少的项目,而MyISAM的读性能是比Innodb强很多的。

  二、MyISAM的索引和数据是分开的,而且索引是有压缩的,内存使用率就对应提升了很多。能加载更多索引,而Innodb是索引和数据是紧密捆绑的,没有使用压缩从而会形成Innodb比MyISAM体积庞大不小。

  三、常常隔1,2个月就会发生应用开发人员不当心update一个表where写的范围不对,致使这个表无法正经常使用了,这个时候MyISAM的优越性就体现出来了,随便从当天拷贝的压缩包取出对应表的文件,随便放到一个数据库目录下,而后dump成sql再导回到主库,并把对应的binlog补上。若是是Innodb,恐怕不可能有这么快速度,别和我说让Innodb按期用导出xxx.sql机制备份,由于最小的一个数据库实例的数据量基本都是几十G大小。

  四、从接触的应用逻辑来讲,select count(*) 和order by 是最频繁的,大概能占了整个sql总语句的60%以上的操做,而这种操做Innodb其实也是会锁表的,不少人觉得Innodb是行级锁,那个只是where对它主键是有效,非主键的都会锁全表的。

  五、还有就是常常有不少应用部门须要我给他们按期某些表的数据,MyISAM的话很方便,只要发给他们对应那表的frm.MYD,MYI的文件,让他们本身在对应版本的数据库启动就行,而Innodb就须要导出xxx.sql了,由于光给别人文件,受字典数据文件的影响,对方是没法使用的。

  六、若是和MyISAM比insert写操做的话,Innodb还达不到MyISAM的写性能,若是是针对基于索引的update操做,虽然MyISAM可能会逊色Innodb,可是那么高并发的写,从库可否追的上也是一个问题,还不如经过多实例分库分表架构来解决。

  七、若是是用MyISAM的话,merge引擎能够大大加快应用部门的开发速度,他们只要对这个merge表作一些select count(*)操做,很是适合大项目总量约几亿的rows某一类型(如日志,调查统计)的业务表。

  固然Innodb也不是绝对不用,用事务的项目就用Innodb的。另外,可能有人会说你MyISAM没法抗太多写操做,可是能够经过架构来弥补。