InnoDB和MyISAM的区别

(1)InnoDB和MyISAM都是Mysql的存储引擎,现在MyISAM也逐渐被InnoDB给替代,主要因为InnoDB支持事务和行级锁,MyISAM不支持事务和行级锁,MyISAM最小锁单位是表级。因为MyISAM不支持行级锁,所以在并发处理能力上InnoDB会比MyISAM好。

(2) 数据的存储上:MyISAM的索引也是由B+树构成,但是树的叶子结点存的是行数据的地址,查找时需要找到叶子结点的地址,再根据叶子结点地址查找数据。

图片

InnoDB的主键索引的叶子结点直接就是存储行数据,查找主键索引树就能获得数据:

图片

若是根据非主键索引查找,非主键索引的叶子结点存储的就是,当前索引值以及对应的主键的值,若是联合索引存储的就是联合索引值和对应的主键值。

图片

(3)数据文件构成:MyISAM有三种存储文件分别是扩展名为:.frm(文件存储表定义)、.MYD (MYData数据文件)、.MYI (MYIndex索引文件)。而InnoDB的表只受限于操作系统文件的大小,一般是2GB

(4)查询区别:对于读多写少的业务场景,MyISAM会更加适合,而对于update和insert比较多的场景InnoDB会比较适合。

(5)count(*)区别:select count(*) from table,MyISAM引擎会查询已经保存好的行数,这是不加where的条件下,而InnoDB需要全表扫描一遍,InnoDB并没有保存表的具体行数。

(6)其它的区别:InnoDB支持外键,但是不支持全文索引,而MyISAM不支持外键,支持全文索引,InnoDB的主键的范围比MyISAM的大。

总结

MyISAMInnoDB
默认不支持支持
事务不支持支持
外键不支持支持
聚集索引不支持支持
索引和数据分开存储存储在一起
MVCC不支持支持
备份不支持在线热备
全文索引支持不支持
主键范围
并发能力高(通过MVCC来支持)
锁粒度表锁行锁、表锁、页锁
查询读多写少更新和插入较多的场景
行数保存不保存
崩溃恢复慢,易丢失概率低
数据文件.frm(文件存储表定义)
.MYD (MYData数据文件)
.MYI (MYIndex索引文件)
.frm
.ibd
只受限于操作系统文件的大小
一般是2GB