① 事务
如果应用需要事务支持,那么InnoDB是最稳定的选择。如果不需要事务支持,且主要是SELECT和INSERT操作,那么MyISAM也是不错的选择。
② 锁粒度
MyISAM支持表级锁定。InnoDB支持行级锁,但是InnoDB表的行锁也不是绝对的,如果在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表。
③ 并发
InnoDB采用MVCC来支持高并发,并且实现了4个隔离型级别。MVCC理解为行级锁的变种,但是很多情况下避免了加锁操作,开销更低。同时实现了非阻塞读操作,写操作也只是锁定必要行。InnoDB的阻塞问题和隔离性级别有关,比如说可重复读级别下,UPDATE DELETE等“当前读”会被间隙锁阻塞。
MySQL 在InnoDB引擎下有当前读和快照读两种模式。
当前读即加锁读,读取记录的最新版本号,会加锁保证其他并发事务不能修改当前记录,直至释放锁。INSERT/UPDATE/DELETE操作默认使用当前读,SELECT语句加LOCK IN SHARE MODE或FOR UPDATE的查询也采用当前读模式。
快照读:不加锁,读取记录的快照版本,而非最新版本。使用MVCC机制,最大的好处是读取不需要加锁,读写不冲突,用于读操作多于写操作的应用,即普通的一条SELECT语句默认都是使用快照读MVCC实现模式。
MyISAM读写互相阻塞,不仅会在写入的时候阻塞读取,MyISAM还会在读取的时候阻塞写入,但读本身并不会阻塞另外的读。
④ 索引
InnoDB(索引组织表)使用的聚簇索引、索引就是数据。MyISAM(堆组织表)使用的是非聚簇索引、索引和文件分开,随机存储,只能缓存索引。
⑤ 细节说明
InnoDB 中不保存表的具体行数,注意的是,当COUNT(*)语句包含 WHERE条件时,两种表的操作是一样的。
DELETE FROM TABLE时,InnoDB不会重新建立表,而是一行一行的删除。
MyISAM的索引和数据是分开的,并且索引是有压缩的,可以提高内存使用率。而Innodb是索引和数据是紧密捆绑的,没有使用压缩从而会造成Innodb比MyISAM体积庞大不小。
如果对INSERT速度较高要求,可以使用MyISAM。MyISAM只是将数据写到内存里,然后操作系统定期将数据刷写到磁盘上。
MyISAM表是保存成文件的形式,在跨平台的数据转移中使用MyISAM存储会省去不少的麻烦。
为什么有人认为MyISAM会比Innodb 的查询速度快?(非官方结论)
InnoDB 在做SELECT的时候,要维护的东西比MYISAM引擎多很多
1)InnoDB 要缓存数据和索引,MyISAM只缓存索引块。
2)Innodb寻址要映射到块,再到行,MyISAM记录的直接是文件的OFFSET,定位比InnoDB要快。
3)InnoDB 还需要维护MVCC一致。