1. 事务:InnoDB支持,MyISAM不支持,在InnoDB中每一条SQL语句都会默认封装成事务自动提交,然而这样会影响速度,因此最好把多条SQL语句放在begin和commit之间组成一个事务;
2. 索引:InnoDB是聚集索引,使用B+Tree作为索引结构,数据文件是和(主键)索引绑在一起的(表数据文件本身就是按B+Tree组织的一个索引结构),而辅助索引包含主键列(主索引)。
MyISAM是非聚集索引,也是使用B+Tree作为索引结构,但索引和数据文件是分离的,索引保存的是数据文件的指针,主键索引和辅助索引是独立的。
3.全文索引:Innodb不支持全文索引,而MyISAM支持全文索引,查询效率上MyISAM要高;不过MySQL在5.7版本以后,InnoDB支持全文索引了。
4.外键:InnoDB支持外键,而MyISAM不支持。
5.count()函数:InnoDB不保存表的具体行数,执行select count(*) from table时需要全表扫描。而MyISAM用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快;
6.主键:InnoDB表必须有主键(没有指定的话引擎会自动寻找找或生产一个主键),而Myisam可以没有。
7.存储文件类型:InnoDB
存储文件有frm、ibd,而MyISAM是frm、myd、myi
frm是表定义文件,ibd是数据文件,myd是数据文件,myi是索引文件
8.表锁:MyISAM只支持表级锁,用户在操作myisam表时,select,update,delete,insert语句都会给表自动加锁;
InnoDB支持表、行(默认)级锁;
InnoDB的行锁是实现在索引上的,而不是锁在物理行记录上,就是说如果访问没有命中索引的话是无法使用行锁会退化为表锁。
比如:有一张InnoDB表,t_user(id,name,age,address),id为PK 无其它索引
update t_user set age = 18 where id = 2 ; 命中索引,行锁
update t_user set age = 20 where id != 6 ; 未命中索引,表锁
update t_user set age = 21 where name = "Jie" ; 无索引,表锁
总结:
MyISAM不支持事务,而且不支持外键,如果对数据库表需要执行大量的 SELECT 操作,MyISAM比较适合
InnoDB支持外键、行锁、事务是他的最大特点。如果有大量的 UPDATE 和 INSERT,建议使用InnoDB