InnoDB 和 MyISAM 引擎对比

MyISAM 引擎InnoDB 引擎
MySQL 索引非聚集索引聚集索引
全文索引支持支持
主键允许没有索引和主键的表存在如果没有设定主键,则判断有无非空唯一索引;
如果也没有,则自动生成一个 6 字节的用户不可见的主键。
外键不支持支持
AUTO_INCREMENT自然增长列必须是索引。
如果建立组合索引,自然增长列可以不是第一列。
自然增长列一定有对应索引。
如果建立组合索引,自然增长列必须是第一列。
MySQL 事务不支持支持
MySQL 锁机制表级锁表级锁+行级锁
update table set num=1 where name like “%aaa%”
无法获得扫描范围,会锁全表。
MySQL MVCC不支持,毕竟行级锁都不支持。支持
安全恢复不支持支持,通过 redo log 进行异常崩溃后的恢复
MySQL count逻辑O(1)读取O(n)读取
关注点性能:访问速度快、节省资源、消耗少、简单业务事务:并发写、事务、更大资源
默认使用
CRUD 操作大量 select 时,更好的选择大量的更新操作,更好的选择
存储结构每个 MyISAM 在磁盘上存储成三个文件。分别为:表定义文件、数据文件、索引文件。
.frm 文件存储表定义,.MYD 存储数据文件,.MYI 存储索引文件。
表和索引放到一起存储。InnoDB 表的大小只受限于操作系统文件的大小,一般 2G。
可移植性、备份数据单独存储,跨平台转移方便。免费的方案可以是拷贝数据文件、备份 binlog,或者用 mysqldump,在数据量达到几十 G 的时候就相对痛苦了。
可能需要导出 xxx.sql 了,因为光给别人文件,受字典数据文件的影响,对方是无法使用的。

引擎选择问题

MyISAM: 不需要事务、高并发、崩溃恢复,需要高速存储、全文搜索能力,读操作较多时,考虑 MyISAM 引擎。

InnoDB: 需要事务、高并发,需要较多的读写操作,需要崩溃恢复,考虑 InnoDB 引擎。

《MySQL 高性能》上面有一句话这样写到:

不要轻易相信“MyISAM 比 InnoDB 快”之类的经验之谈,这个结论往往不是绝对的。在很多我们已知场景中,InnoDB 的速度都可以让 MyISAM 望尘莫及,尤其是用到了聚簇索引,或者需要访问的数据都可以放入内存的应用。