InnoDB与Myisam的区别

如何选择存储引擎:

如果不在乎可扩展能力和并发能力,也不在乎崩溃后数据的所示问题,却对innoDB的空间占用过多比较敏感,这种场合应该使用MyISAM。否则应该使用InnoDB。如果需要使用在线热备份,需要使用事务的订单类业务,最好使用InnoDB。

1.构成

MyISAM:每个MyISAM在磁盘上存储成三个文件,文件的名字以表的名字开始,扩展名指出文件类型。 

.frm表定义文件
.myd数据文件
.myi 索引文件
InnoDB包括数据文件和它的日志文件,表大小只受限于操作系统文件的大小,一般为 2GB。
错误日志:记录出错信息,也记录一些警告信息或者正确的信息。
查询日志:记录所有对数据库请求的信息,不论这些请求是否得到了正确的执行。
慢查询日志:设置一个阈值,将运行时间超过该值的所有SQL语句都记录到慢查询的日志文件中。
二进制日志:记录对数据库执行更改的所有操作。
 
2.事务处理上
MyISAM:为了强调性能,不提供事务支持;
InnoDB供事务支持事务,外部键等功能
 
3.SELECT UPDATE,INSERT,Delete操 作
MyISAM:如果执行大量的SELECT,MyISAM是更好的选择。因为
a.MyISAM的索引和数据是分开的,并且索引是有压缩的,内存使用率就对应提高了不少。能加载更多索引。而Innodb是索引和数据是紧密捆绑的,没有使用压缩从而会造成Innodb比MyISAM体积庞大不小
b.数据块,INNODB要缓存,MYISAM只缓存索引块,  这中间还有换进换出的减少;
c.innodb寻址要映射到块,再到行,MYISAM记录的直接是文件的OFFSET,定位比INNODB要快
d.innodb还需要维护MVCC一致;虽然你的场景没有,但他还是需要去检查和维护MVCC (Multi-Version Concurrency Control)多版本并发控制 
 
4.对AUTO_INCREMENT的 操作
MyISAM:为INSERT和UPDATE操作自动更新这一列,更好和更快。可以和其他字段一起建立联合索引
InnoDB必须包含只有该字段的索引,它被用在为该列赋新值。
 
5.表 的具体行数
MyISAM:select count(*) from table 只要简单的读出保存好的行数
InnoDBselect count(*) from table  扫描一遍整个表来计算有多少行
注意:当count(*)语句包含 where条件时,两种引擎的操作是一样的
 
6.锁
MyISAM:不支持行级锁,只支持表锁
InnoDB提供行锁但是如果在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表。默认事务隔离级别是repeatable read,通过间隙锁(next-key locking)避免幻读的出现。
 
7.数据恢复
MyISAM:恢复时间较长
InnoDB利用事务日志进行数据恢复,这会比较快
原文地址:https://www.cnblogs.com/wzj4858/p/7909335.html