一、区别
区别一:MyISAM 是非事务安全的,InnoDB 是事务安全的
- 事务安全的特点为更安全,遇到问题会自动恢复或从备份加事务日志回复,如果更新失败,你的所有改变都变回原来。
- 非事务安全的优点为更快,所需的磁盘空间更小,执行更新时需要的内存更小,但是所有发生的改变都是永久的。
InnoDB 用于事务处理,具有 ACID(原子性,一致性,隔离性,持久性) 事务支持等特性,如果在应用中大量使用 insert 和 update 操作,应选用 InnoDB 。
区别二:MyISAM 锁的粒度是表级的,而 InnoDB 支持行级锁
数据库引擎具有多粒度锁定,允许一个事务锁定不同类型的资源。 为了尽量减少锁定的开销,数据库引擎自动将资源锁定在适合任务的级别。 锁定在较小的粒度 (例如行) 可以提高并发度,但开销较高,因为如果锁定了许多行,则需要持有更多的锁。 锁定在较大的粒度 (例如表) 会降低了并发度,因为锁定整个表限制了其他事务对表中任意部分的访问。 但其开销较低,因为需要维护的锁较少。
区别三:MyISAM 支持全文类型索引,而 InnoDB(以前) 不支持全文索引
- 主键索引:主键是一种唯一性索引,但它必须指定为
PRIMARY KEY
,每个表只能有一个主键。 - 唯一索引:索引列的所有值都只能出现一次,即必须唯一,值可以为空。
- 普通索引:基本的索引类型,值可以为空,没有唯一性的限制。
- 全文索引:全文索引的索引类型为 FULLTEXT 。全文索引可以在 varchar 、 char 、 text 类型的列上创建。可以通过 ALTER TABLE 或 CREATE INDEX 命令创建。对于大规模的数据集,通过 ALTER TABLE(或者 CREATE INDEX) 命令创建全文索引要比把记录插入带有全文索引的空表更快。 MyISAM 支持全文索引,InnoDB 在 mysql5.6 之后支持了全文索引。
区别四:InnoDB 支持外键,MyISAM 不支持
区别五:MyISAM 表保存成文件形式,跨平台使用更加方便
二、应用场景
MyISAM 是 MySQL 默认的引擎,但是它没有提供对数据库事务的支持,也不支持行级锁和外键,因此当 INSERT(插入) 或 UPDATE(更新) 数据时即写操作需要锁定整个表,效率便会低一些。不过和 Innodb 不同,MyISAM 中存储了表的行数,于是 SELECT COUNT(*) FROM TABLE
时只需要直接读取已经保存好的值而不需要进行全表扫描。同时 MyISAM 提供高速存储和检索以及全文搜索能力,如果在应用中执行大量 select 操作,应该选择 MyISAM 。如果表的读操作远远多于写操作且不需要数据库事务的支持,那么 MyISAM 也是很好的选择。
Innodb 引擎提供了对数据库 ACID 事务的支持,并且实现了 SQL 标准的四种隔离级别。该引擎还提供了行级锁和外键约束,它的设计目标是处理大容量数据库系统,它本身其实就是基于 MySQL 后台的完整数据库系统,MySQL 运行时 Innodb 会在内存中建立缓冲池,用于缓冲数据和索引。但是该引擎不支持 FULLTEXT 类型的索引,而且它没有保存表的行数,当 SELECT COUNT(*) FROM TABLE
时需要扫描全表。当需要使用数据库事务时,该引擎当然是首选。由于锁的粒度更小,写操作不会锁定全表,所以在并发较高时,使用 Innodb 引擎会提升效率。但是使用行级锁也不是绝对的,如果在执行一个 SQL 语句时 MySQL 不能确定要扫描的范围,InnoDB 表同样会锁全表。
评论