InnoDB
InnoDB是MySQL的默认事务型引擎,也是最重要、使用最广泛的存储引擎。它被设计用来处理大量的短期事务。InnoDB的性能和自动崩溃恢复特性,使得它在非事务型存储的需求中也很流行。
存储
InnoDB的数据存储在表空间(tablespace)中,表空间是由InnoDB管理的一个黑盒子,由一系列的数据文件组成。在MySQL4.1以后的版本中,InnoDB可以将每个表的数据和索引放在单独的文件中。
并发
InnoDB采用MVCC来支持高并发,并且实现了四个标准的隔离级别。其默认级别是REPEATABLE READ(可重复读),并且通过间隙锁策略防止幻读的出现。间隙锁使得InnoDB不仅仅锁定查询设计的行,还会对索引中的间隙进行锁定,以防止幻影行的插入。
索引
InnoDB表是基于聚簇索引建立的,聚簇索引对主键查询有很高的性能。
优化
InnoDB内部做了很多优化:
- 从磁盘读取数据时采用的可预测性预读
- 能够自动在内存中创建hash索引以加速读操作的自适应哈希索引
- 能够加速插入操作的插入缓冲区
作为事务型的存储引擎,InnoDB通过一些机制和工具支持真正的热备份。MySQL的其它存储引擎不支持热备份,要获取一致性视图需要停止对所有表的写入,而在读写混合场景中,停止写入可能也意味着停止读取
MyISAM
在MySQL5.1及之前的版本,MyISAM是默认存储引擎。MyISAM提供了大量的特性,包括全文索引、压缩、空间函数等,但是MyISAM不支持事务和行级锁
存储
MyISAM会将表存储在两个文件中:数据文件和索引文件。MyISAM表可以包含动态或者静态行。MySQL会根据表的定义来决定采用何种行格式。MyISAM表可以存储的行记录数,一般受限于可用的磁盘空间或者操作系统中单个文件的最大尺寸
特性
加锁与并发(表级锁)
MyISAM对整张表加锁,而不是针对行。读取时添加共享锁,写入时添加排它锁。
修复
对于MyISAM表,MySQL可以手工或者自动执行检查和修复操作。执行表的修复可能导致一些数据丢失,而且修复操作是非常慢的。
索引特性
对MyISAM表,即使是BLOB和TEXT等长字段,也可以基于前500个字符创建索引。也支持创建全文索引。
延迟更新索引键
创建MyISAM表的时候,如果制定了DELAY_KEY_WRITE选项,在每次修改执行完成时,不会立刻将修改的索引数据写入磁盘,而是会写到内存中的键缓冲区,只有在清理件缓冲区或者关闭表的时候才会将对应的索引快写入到磁盘。