一、MyISAM
1.1 MYISAM简介
MyISAM是MySQL的默认数据库引擎(5.5版)之前,由早期的ISAM(Indexed Sequential Access Method:有索引的顺序访问方法)所改良。虽然性能极佳,而且提供了大量的特性,包括全文索引、压缩、空间函数等,但MyISAM不支持事务和行级锁,而且最大的优点就是奔溃后无法安全恢复。不过,5.5版本之后,MySQL引入了InnoDB(另一种数据库引擎)。
MyISAM更适合读密集的表,而InnoDB更适合写密集的表。在数据库主从分离的情况下,经常选择MyISAN作为主库的存储引擎。
1.2MyISAM特点
1. 不支持行锁(MyIASM只有表锁),读取时对需要读到的所有表 加锁,写入时则对表加排它锁。
2. 不支持事务。
3. 不支持外键。
4. 不支持奔溃后的安全恢复。
5. 在表有读取查询的同时,支持往表中插入新记录。
6. 支持BLOB和TEXT的前500个字符索引,支持全文索引。
7. 支持延迟更新索引,极大地 提升了写入性能。
8. 对于不会进行修改的表,支持压缩表,极大的减少了磁盘空间的占用。
**注:MySQL的行锁和表锁(锁是计算机协调多个进程或 纯线程并发访问某一资源的机制)表级锁:**每次操作锁住整张表。开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高, 并发度最低;行级锁:每次操作锁住一行数据。开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低, 并发度也最高。
二、InnoDB
2.1 InnoDB简介
InnoDB是MySQL的默认数据库引擎(5.5版之后),2006年五月时由甲骨文公司并购。与传统的ISAM和MyISAM相比,InnoDB的最大特色就是支持了ACID兼容的事务(Transaction)功能。
2.2 InnoDB特点
1.支持行锁。
2.支持事务。
3.支持外键。
4.支持奔溃后的安全恢复。
5.不支持全文索引。
三.关于二者的对比和总结
3.1二者的常见对比
1.**count运算上的区别:**因为MyISAM缓存油表Meta-data(行数等),因此在做count(*)时,对于一个结构很好的查询是不需要消耗多少资源的。而对于InnoDB来说,则没有这种缓存。
2.**是否支持事务和奔溃后的安全恢复:**MyISAM强调的是性能,每次查询具有原子性,其执行数度比InnoDB类型更快,但是不支持事务。但是InnoDB提供事务支持,外键等高级数据库功能。具有事务(commit),回滚(rollback)和奔溃修复能力(crash recovery capabilities)的事务安全(Transaction-safe(ACID compliant))型表。
3.**是否支持外键:**MyISAM不支持,而InnoDB支持。
3.2总结
MyISAM更适合读密集的表,而InnoDB更适合写密集的表。在数据库主从分离的情况下,经常选择MyISAM作为主库的存储引擎。
一般来说,如果需要事务支持,并且具有较高的读取频率(MyISAM的表锁的粒度太大,所以当该表并发量较高时,要等待的查询就会很多),InnoDB是不错的选择。如果你的数据量很大(MyISAM支持压缩特性可以减少磁盘的空间占用),而且不需要支持事务时,MyISAM是最好的选择。