1.InnoDB支持事务,MyISAM不支持,对于InnoDB来说每一条SQL语句都被封装为事务,事务提供了一个可以从失败中恢复到正常的方法、在异常情况下数据库保持一致性、在多个程序并发访问时提供了隔离的方法,但是事务会影响速度
2.InnoDB支持外键,而MyISAM不支持外键
3.InnoDB是聚簇索引,即索引和数据文件是绑定的,MyISAM是非聚簇索引,即索引和数据文件不是绑定的,索引中存储的是数据文件的地址。二者都是利用B+树来存储索引的。也就是说,对于InnoDB,B+树的叶子节点就是索引所对应的数据,而对于MyISAM,B+树的叶子节点存储的是数据文件的地址。
4.InnoDB不保存表的具体行数,执行select count(*) from table时需要对整个表进行扫描,而MySIAM用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可(不能有where子句)
InnoDB没有这个变量是因为其独有的事务性,在同一时刻表中的行数对于不同的事务来说是不同的。
5.InnoDB必须有主键,而MyISAM可以没有
如何选择
1.如果不需要支持事务,可以考虑MyISAM
2.如果表中绝大多数操作都是读取查询,那么可以考虑MyISAM
3.如果系统崩溃,MyISAM恢复起来比较困难
InnoDB为什么推荐使用自增ID作为主键
自增ID可以保证在插入时B+树的索引是向右边扩展的,可以减少B+树频繁的合并和分裂
借鉴的博客:https://blog.csdn.net/qq_35642036/article/details/82820178