[原创] 关于Mysql 存储引擎 MyISAM 和 InnoDB 的区别
一. 事务区别
InnoDB 支持事务,MyISAM 不支持事务。
这是 MySQL 将默认存储引擎从 MyISAM 变成 InnoDB 的重要原因之一。
二. 外键区别
InnoDB 支持外键,而 MyISAM 不支持。
对一个包含外键的 InnoDB 表转为 MYISAM 会失败。
三. 索引数据结构区别
1. InnoDB 是聚集索引
聚簇索引的文件存放在主键索引的叶子节点上,因此 InnoDB 必须要有主键,通过主键索引效率很高。但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此,主键不应该过大,因为主键太大,其他索引也都会很大。
2. MyISAM 是非聚集索引
非聚集索引,数据文件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的。
四. select count(*) 性能区别
InnoDB 不保存表的具体行数,执行 select count(*) from table 时需要全表扫描。而MyISAM 用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,性能是毫秒级。
五. 最小粒度锁区别
InnoDB 最小的锁粒度是行锁,MyISAM 最小的锁粒度是表锁。一个更新语句会锁住整张表,导致其他查询和更新都会被阻塞,因此并发访问受限。这也是 MySQL自5.5版本后将默认存储引擎从 MyISAM 变成 InnoDB 的重要原因之一。
六. Mysql存储引擎选择,抉择因素
1. 事务性需求选InnoDB
是否要支持事务,如果要请选择 InnoDB,如果不需要可以考虑 MyISAM.
2. 读多写少场景选MyISAM
如果表中绝大多数都只是读查询,可以考虑 MyISAM,如果既有读写也挺频繁,请使用InnoDB。
七. 总结
系统奔溃后,MyISAM恢复起来会更困难,看自身能否接受,若不能接受就选 InnoDB。毕竟,MySQL5.5版本开始Innodb已经成为Mysql的默认引擎(之前是MyISAM),说明其优势是有目共睹的。如果你实在不知道用什么存储引擎,就用默认的InnoDB吧,性能也不会很糟糕。