InnoDB:
是MySQL默认的事务型存储引擎,只有当需要它不支持的特性时,才会考虑使用其它的存储引擎。
实现了四个标准的隔离级别,其中默认为可重复读,在可重复读的隔离级别下,通过MVCC(多版本并发控制协议)+ 间隙锁(Next-key Locking)防止幻读。
主索引为聚簇索引,在索引中保存数据,从而避免直接读取磁盘,因此对查询性能有很大的提升。
支持真正的在线热备份。其它存储引擎不支持在线热备份。
支持行级锁,通过给索引项加锁来实现,即只有通过索引条件检索数据,才会使用行级锁,否则使用表锁。
InnoDB不会对表中行的总量进行预先统计,每次count需要遍历计算。
MyISAM:
设计简单,数据以紧密格式存储。对于只读数据,或者表比较小、可以容忍修复操作,则依然可以使用它。
提供了大量的特性,包括压缩表、空间数据索引等。
不支持事务。
不支持行级锁,只能对整张表加锁,读取时会对需要读到的所有表加共享锁,写入时则对表加排它锁。
会实时保存数据库表中的总行数,计算快。
总结:
事务:MyISAM不支持,InnoDB支持。
锁级别: MyISAM 表级锁,InnoDB 行级锁及外键约束。
MyISAM存储表的总行数;InnoDB不存储总行数。
MyISAM采用非聚集索引,B+树叶子存储指向数据文件的指针。InnoDB主键索引采用聚集索引,B+树叶子存储数据。
崩溃恢复: MyISAM 崩溃后发生损坏的概率比 InnoDB 高很多,而且恢复的速度也更慢。
使用场景:
MyISAM适合:插入不频繁,查询非常频繁,如果执行大量的SELECT,MyISAM是更好的选择,没有事务。
InnoDB适合:可靠性要求比较高,或者要求事务; 表更新和查询都相当的频繁, 大量的INSERT或UPDATE。