Mysql的引擎机制有两种,分别是MyISAM
和InnoDB
,mysql5.5版本之后默认的引擎已经是InnoDB
了。本文简单讲解一下这2中引擎机制的区别
锁机制
MyISAM:只支持表级锁,用户在操作myisam表时,select,update,delete,insert语句都会给表自动加锁,这种处理方式一方面加锁的开销比较小,且不会出现死锁,但另一方面并发性能较差
InnoDB:支持行锁。每次操作锁住一行数据,一方面行级锁在每次获取锁和释放锁的操作需要消耗比表锁更多的资源,速度较慢,且可能发生死锁,但是另一方面由于锁的粒度较小,发生锁冲突的概率也比较低,并发性较好。此外,即使是使用了InnoDB存储引擎,但如果MySQL执行一条sql语句时不能确定要扫描的范围,也会锁住整张表。
事务机制
MyISAM:不支持事务
InnoDB:支持事务。由于MyISAM在很长一段时间内是MySQL的默认存储引擎,所以在很多人的印象中MySQL是不支持事务的数据库。实际上,InnoDB是一个性能良好的事务性引擎。它实现了四个标准的隔离级别,默认的隔离级别为可重复读(REPEATABLE READ),并通过间隙锁策略来防止幻读的出现。此外它还通过多版本并发控制(MVCC)来支持高并发。
记录数查询
MyISAM:直接记录了表的行数,使用select count(*)
时直接给出结果
InnnoDB:需要全表扫描来统计行数,当数据量很大时比较耗时,但是当使用where
来指定范围时,两者的耗时是一样的
外键机制
MyISAM:不支持外键
InnoDb:支持外键
修复机制
MyISAM:崩溃后无法安全恢复
InnoDB:支持崩溃后的安全恢复。InnoDB实现了一套完善的崩溃恢复机制,保证在任何状态下(包括在崩溃恢复状态下)数据库挂了,都能正常恢复
如果你问我那我怎么选择引擎呢,直接InnoDB
,官方把默认引擎从MyISAM
改成InnoDB
不是没有原因的,而且使用MyISAM
引擎,数据一旦崩溃直接哭吧