Mysql有两大经常使用的存储引擎MyISAM,InnoDB,默认的形式是前者。 二者基本的差异是对事务处理、外键和行级锁的主持上,InnoDB支持事务处理、外键等高级特性,而MyISAM不支持。MyISAM类型的表强调的是性能,若是执行大量的select操做,MyISAM是更好的选择,其执行数度比InnoDB类型更快。 二者具体的差异以下: 1.MyISAM的索引和文件自己是分开的,这一点在存储上能看出来:每一个MyISAM在磁盘上存储成三个文件:文件的名字以表的名字开始,扩展名指出文件类型。 .frm文件存储表定义;数据文件:扩展名为.MYD (MYData);索引文件:扩展名是.MYI (MYIndex)。 2.在事务处理方面:MyISAM不支持事务处理,并且不支持外键(foreign key),而InnoDB支持。 例如:create table table2( id char(1) not null, foreign key(id) references table1(id) );//table1已经创建 这里默认使MyISAM的存储引擎,show create table2一下,则会出现: CREATE TABLE `table2` ( `id` char(1) NOT NULL, KEY `id` (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=gb2312 可见,table2并无创建外键。 3.InnoDB不支持fulltext类型的索引; 4.若是执行大量的SELECT,MyISAM是更好的选择,若是执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表; 5.delete from table时,InnoDB不会从新创建表,而是一行一行的删除; 6.LOAD TABLE FROM MASTER操做对InnoDB是不起做用的,解决方法是首先把InnoDB表改为MyISAM表,导入数据后再改为InnoDB表,可是对于使用的额外的InnoDB特性(例如外键)的表不适用; 7.对AUTO_INCREMENT字段的操做:对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,在MyISAM表中,能够和其余字段一块儿创建联合索引; 8.InnoDB中不保存表的具体行数,而MyISAM是保存的,执行select count(*) from table时,InnoDB要扫描一遍整个表来计算有多少行,可是MyISAM只要简单的读出保存好的行数便可。当count(*)语句包含where条件时例外,两种表的操做是同样的(这很好理解,由于存储的行数不能利用了)。 9.对锁的支持:InnoDB提供行锁(和Oracle相似),而MyISAM则在整个表上加锁。