简单总结:
增删改操作多用 InnoDB
需要使用事务用 InnoDB
如果系统崩溃后需要自我修复使用 InnoDB
读操作多用 MyISAM
需要偏重性能使用 MyISAM
需要全文检索使用 MyISAM(mysql5.7 的 innodb 已支持全文索引)
InnoDB 支持事务, 回滚和崩溃修复能力, 行锁, 外键而 MyISA 不支持
MySQL5.5 版本开始 Innodb 已经成为 Mysql 的默认引擎 (之前是 MyISAM), 说明其优势是有目共睹的, 如果你不知道用什么, 那就用 InnoDB, 至少不会差.
1. InnoDB 支持事务, MyISAM 不支持
对于 InnoDB 每一条 SQL 语言都默认封装成事务, 自动提交, 这样会影响速度, 所以最好把多条 SQL 语言放在 begin 和 commit 之间, 组成一个事务;
2. InnoDB 支持外键, 而 MyISAM 不支持.
对一个包含外键的 InnoDB 表转为 MYISAM 会失败;
3. InnoDB 是聚集索引
数据文件是和索引绑在一起的, 必须要有主键, 通过主键索引效率很高. 但是辅助索引需要两次查询, 先查询到主键, 然后再通过主键查询到数据. 因此, 主键不应该过大, 因为主键太大, 其他索引也都会很大. 而 MyISAM 是非聚集索引, 数据文件是分离的, 索引保存的是数据文件的指针. 主键索引和辅助索引是独立的.
4. InnoDB 不保存表的具体行数
执行 select count(*) from table 时需要全表扫描. 而 MyISAM 用一个变量保存了整个表的行数, 执行上述语句时只需要读出该变量即可, 速度很快;
5. InnoDB 不支持全文索引 (mysql5.7 的 innodb 已支持全文索引)
而 MyISAM 支持全文索引, 查询效率上 MyISAM 要高;
6. InnoDB 提供行锁
InnoDB 行锁是通过给索引上的索引项加锁来实现的, 这一点 MySQL 与 Oracle 不同, 后者是通过在数据块中对相应数据行加锁来实现的. InnoDB 这种行锁实现特点意味着: 只有通过索引条件检索数据, InnoDB 才使用行级锁, 否则, InnoDB 将使用表锁!
InnoDB 表的行锁也不是绝对的, 如果在执行一个 SQL 语句时 MySQL 不能确定要扫描的范围, InnoDB 表同样会锁全表, 例如 update table set num=1 where name like "%aaa%"
来源: http://www.jianshu.com/p/2198ace32a52