MyISAM和innoDB的区别

MySQL支持数个存储引擎做为对不一样表的类型的处理器。html

MyISAM,MEMORY,InnoDB,NDB Cluster,ARCHIVE,CSV,BLACKHOLE,FEDERATED.sql

MyISAM是默认存储引擎。它基于更老的ISAM代码,但有不少有用的扩展。MyISAM管理非事务表。它提供高速存储和检索,以及全文搜索能力(注意MySQL 5.1不支持ISAM).每一个MyISAM在磁盘上存储成三个文件: .frm文件存储表定义,数据文件的扩展名为.MYD (MYData),索引文件的扩展名是.MYI (MYIndex)。数据库

MyISAM支持三种不一样存储格式:固定格式和动态格式,已压缩格式缓存

1.静态格式是MyISAM表的默认存储格式。当表不包含变量长度列(VARCHAR, BLOB, 或TEXT)时,使用这个格式。
2.若是一个MyISAM表包含任何可变长度 列(VARCHAR, BLOB或TEXTDynamic),或者若是一个表被用ROW_FORMAT=DYNAMIC选项来建立,动态存储格式被使用。
3.已压缩存储格式是由myisampack工具建立的只读格式。安全

 

InnoDB给MySQL提供 了具备提交,回滚和崩溃恢复能力的事务安全(ACID兼容)存储引擎。
InnoDB是为处理巨大数据量时的最大性能设计。它的CPU效率多是任何其它基于磁盘的关系数据库引擎所不能匹敌的。
InnoDB存储引擎被彻底与MySQL服务器整合,InnoDB存储引擎为在主内存中缓存数据和索引而维持它本身的缓冲池。InnoDB存储它的表&索引在一个表空间中,表空间能够包含数个文件(或原始磁盘分区)。这与MyISAM表不一样,好比在MyISAM表中每一个表被存在分离的文件中。InnoDB 表能够是任何尺寸,即便在文件尺寸被限制为2GB的操做系统上。服务器

InnoDB默认地被包含在MySQL二进制分发中
InnoDB被用来在众多须要高性能的大型数据库站点上产生。架构


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%”
两种类型最主要的差异就是Innodb 支持事务处理与外键和行级锁.而MyISAM不支持.因此MyISAM每每就容易被人认为只适合在小项目中使用。
我做为使用MySQL的用户角度出发,Innodb和MyISAM都是比较喜欢的,可是从我目前运维的数据库平台要达到需求:99.9%的稳定性,方便的扩展性和高可用性来讲的话,MyISAM绝对是个人首选。memcached

缘由以下:
一、首先我目前平台上承载的大部分项目是读多写少的项目,而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的,活跃用户20多万时候,也是很轻松应付了,所以我我的也是很喜欢Innodb的,只是若是从数据库平台应用出发,我仍是会首选MyISAM。
另外,可能有人会说你MyISAM没法抗太多写操做,可是我能够经过架构来弥补,说个我现有用的数据库平台容量:主从数据总量在几百T以上,天天十多亿 pv的动态页面,还有几个大项目是经过数据接口方式调用未算进pv总数,(其中包括一个大项目由于初期memcached没部署,致使单台数据库天天处理 9千万的查询)。而个人总体数据库服务器平均负载都在0.5-1左右。

refer- http://www.cnblogs.com/vicenteforever/articles/1613119.html

相关文章
相关标签/搜索