Mysql之MyIsAM与InnoDB的区别

          Mysql是我们常用的几种数据库之一,是一种非常优秀和强大的数据库,下面我来分享一篇关于mysql常用的两个搜索引擎:MyIsAM和InnoDB.

一、本质区别

(1)MyIsAM:是mysql5.5版本前默认的搜索引擎,虽然性能极佳但不支持事务。

(2)InnoDB:由InnoBase Oy公司所开发的搜索引擎,与ISAM和MyIsAM最大的区别在于支持了数据库(ACID)--原子性、一致性,隔离性、持久性的事务功能。

二、存储结构

(1)MyIsAM:会在磁盘上存储三个文件,第一个文件以表名开始扩展名指出文件类型,.frm文件存储表定义。数据文件的扩展名:.MYD(mydata),索引文件的扩展名:.MYI(myindex).

(2)InnoDB:所有的数据保存在同一个文件之中(也可能是多张表文件或独立表文件),InnoDB的表大小受限于操作系统,一般为2GB.

三、存储空间

(1)MyIsAM:可被压缩,占用空间较小。支持三种不同的存储格式,静态表,动态表,压缩表。

(2)InnoDB:相比之下需要更多的内存去存储数据。它会在主内存中创建专用缓存池,用来高速缓存数据和索引。

四、可移植性、备份和恢复

(1)MyIsAM:数据以文件的方式存储,在扩平台做数据转移很方便、在备份和恢复的时候可对单表进行操作。

(2)InnoDB:免费的方案是拷贝数据文件,备份binlog或用mysqldump在数据量大的情况下相对麻烦。

五、事务的支持

(1)MyIsAM:强调性能,每次查询具有原子性,执行速度比InnoDB快,不支持事务。

(2)InnoDB:支持事务,外部键。具有提交(commit),回滚(rollback)和崩溃修复能力的事务安全性表(ACID)。

六、AUTO_INCREMENT(自增)

(1)MyIsAM:可与其它字段建立联合索引,引擎的自动增长列必须是索引,如果是组合索引,自动增长列可以不是第一列,根据前几列进行排序后递增。

(2)InnoDB:必须包含只有该字段的索引。引擎的自动增长列必须是索引列的第一列。

七、表锁差异

(1)MyIsAM:只支持表级锁,在增删改查(CRUD)都会加上表级锁。

(2)InnoDB:支持事务和行级锁,提高并发环境下的性能,但行锁只会在where的主键是有效的情况下才会执行。如果是非主键则会使用表级锁。

八、全文索引

(1)MyIsAM:支持FULLTEXT类型的全文索引。

(2)InnoDB:不支持FULLTEXT类型的全文索引。但可用sphinx插件来使用全文索引且性能更佳。

九、表主键

(1)MyIsAM:允许没有任何主键和索引,都是保存行地址。

(2)InnoDB:如果没有主键或非空唯一索引,会自动生成一个8字节的主键(用户不可见)。

十、表的具体行数

(1)MyIsAM:保存有表的总行数用select count() from table 可以取值。

(2)InnoDB:没有保存表的总行数,如果使用select count() from table 则会遍历整张表,十分消耗性能。但是在加上where条件后MyIsAM和InnoDB的查询方式又有所不同。

十一、CURD操作

(1)MyIsAM:如果执行大量的select操作可选择MyIsAM。

(2)InnoDB:执行大量的update和delete操作选择InnoDB。

十二、外键支持

(1)MyIsAM:不支持。

(2)InnoDB:支持。

你可能感兴趣的:(mysql)