1. 概述**
InnoDB 是 MySQL 的默认事务型引擎,也是最重要、使用最广泛的存储引擎。它被设计用来处理大量的短期( short 一 lived )事务,短期事务大部分情况是正常提交的,很少会被回滚。 InnoDB 的性能和自动崩溃恢复特性,使得它在非事务型存储的需求中也很流行。除非有非常特别的原因需要使用其他的存储引擎,否则应该优先考虑 InnoDB 引擎。
在 MySQL 5.1及之前的版本, MyISAM 是默认的存储引擎。 MyISAM 提供了大量的特性,包括全文索引、压缩、空间函数(Gls)等,但 MylsAM 不支持事务和行级锁,而且有一个毫无疑问的缺陷就是崩溃后无法安全恢复。尽管如此,它绝不是一无是处。对于只读的数据,或者表比较小、可以忍受修复操作,则依然可以继续使用 MyISAM (但请不要默认使用 MyISAM ,而是应当默认使用 InnoDB )。
2. 区别
2.1 存储
InnoDB 的数据存储在表空间(tablespace)中,表空间是由InnoDB管理的一个黑盒子,以.ibd结尾,由一系列的数据文件组成。在MySQL4.1以后的版本中,InnoDB可以将每个表的数据和索引放在单独的文件中。
MyISAM 会将表存储在两个文件中:数据文件和索引文件,分别以.MYD和.MYI为扩展名。
2.2 事务
InnoDB支持事务、分布式事务,并且实现了四个标准的隔离级别,且默认级别为REPEATABLE READ可重复读,并且通过间隙锁(next-key locking)策略防止幻读的出现。
MyISAM不支持事务。
2.3 索引
MyISAM存储引擎的索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。MyISAM的索引方式也被称为“非聚集索引”。
- 主键索引:使用B+Tree作为索引结构,叶节点的data存放的是数据记录的地址。
- 辅助索引:使用B+Tree作为索引结构,和主键索引没什么区别,只是主键索引的key是唯一的。
MyISAM中索引检索算法首先会从索引树中搜到指定的key,然后通过其记录的数据地址,读取响应的数据记录。
InnoDB存储引擎中,表数据文件本身就是按照B+Tree组织的一个索引结构,树的叶节点存放了完整的数据记录。InnoDB的索引方式也被称为“聚集索引”。
- 主键索引:使用B+Tree作为索引结构,叶节点的data存放的是完整的数据记录。
- 辅助索引:使用B+Tree作为索引结构,叶节点的data存放的是主键。
辅助索引的搜索需要检索两遍索引,首先通过辅助索引获得主键,然后用主键到主索引中检索获得记录。(由于覆盖索引,如果辅助索引中已包含需要的数据,就不会再走一遍主键索引。)另外,因为其按照主键聚集,所以InnoDB要求表必须要有主键,如果没有,MySQL会默认生成6字节的rowid作为主键。
MyISAM支持全文索引,InnoDB在MySQL5.6版本(InnoDB1.2.x版本)之后支持全文索引。
2.4 锁
MyISAM:默认使用的是表级锁,不支持行级锁。
InnoDB:支持表级锁和行级锁。
2.5 count
MyISAM: 保存有表的总行数,如果select count() from table;会直接取出出该值。
InnoDB: 没有保存表的总行数,如果使用select count(*) from table;就会遍历整个表,消耗相当大。
在加了wehre条件后,MyISAM和InnoDB处理的方式是一样的。
2.6 外键
MyISAM:不支持。
InnoDB:支持。
其他
参考
《高性能MySQL》
《MySQL技术内幕:InnoDB存储引擎》
