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 望尘莫及,尤其是用到了聚簇索引,或者需要访问的数据都可以放入内存的应用。