区别
- 构造上的区别:MyISAM在磁盘上存储成三个文件,其中.frm文件存储表定义;.MYD (MYData)为数据文件;.MYI (MYIndex)为索引文件。而Innodb是由.frm文件、表空间(分为独立表空间或者共享表空间)和日志文件(redo log)组成。
- 事务上的区别:MyISAM不支持事务,而InnoDB支持事务。
- 锁上的区别:MyISAM使用的是表锁;而InnoDB使用的行锁(当然InnoDB也支持表锁)。表级锁:直接锁定整张表,在锁定期间,其他进程无法对该表进行写操作,如果设置的是写锁,那么其他进程读也不允许,因此MyISAM支持的并发量低,但MyISAM不会出现死锁; 行级锁:只对指定的行进行锁定,其他进程还是可以对表中的其他行进行操作的。因此行锁能大大的减少数据库操作的冲突,但有时会导致死锁。
- 是否支持外键的区别: MyISAM不支持外键,InnoDB支持外键。
- select count(*)的区别:对于没有where的count(*)使用MyISAM要比InnoDB快得多。因为MyISAM内置了一个计数器,count(*)时它直接从计数器中读,而InnoDB必须扫描全表来计算有多少行。
- 索引方式不同:MyISAM的索引文件和数据文件是分离的,索引文件通过指针来指向数据文件相应的行,而InnoDB的数据文件是按照索引的数据结构(B+Tree)来组织的,即InnoDB的数据文件被存储为一颗B+Tree。
应用场景
- MyISAM适合:(1)做很多count 的计算(2)插入不频繁,查询(select)非常频繁(3)没有事务的情况。
- InnoDB适合:(1)可靠性要求比较高,或者要求事务(2)表更新(update、insert)相当的频繁,并且行锁定的机会比较大的情况。