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则在整个表上加锁。