MYSQL中的MyISAM与InnoDB存储引擎区别整理

一.介绍

MySQL 是最流行的关系型数据库管理系统,结构如下:

MYSQL中的MyISAM与InnoDB存储引擎区别整理_第1张图片
这个图简略的表示了Mysql的体系结构,其中mysql的存储引擎面试经常问,所以下面整理一下


二.对比

1.表锁和行锁

Innodb支持行级锁和表级锁,这是最大的不同,MyISAM只支持表级锁。 随着CPU核数的增加,InnoDB的吞吐量反而越好,而MyISAM,其吞吐量几乎没有什么变化,显然,MyISAM的表锁定机制降低了读和写的吞吐量。


2.是否支持事务

Innodb支持事务,MyISAM不支持事务。MyISAM是一种非事务性的引擎,使得MyISAM引擎的MySQL可以提供高速存储和检索,以及全文搜索能力,适合数据仓库等查询频繁的应用。

  • InnoDB是事务安全的;事务是一种高级的处理方式,如在一些列增删改中只要哪个出错还可以回滚还原,而MyISAM就不可以了。

3.结构上的区别

(1)每个MyISAM在磁盘上存储成三个文件:

  • 第一个文件的名字以表的名字开始,扩展名指出文件类型,.frm文件存储表定义。
  • 第二个文件是数据文件,其扩展名为.MYD (MYData)。
  • 第三个文件是索引文件,其扩展名是.MYI (MYIndex)。

(2)基于磁盘的资源是InnoDB表空间数据文件和它的日志文件,InnoDB 表的 大小只受限于操作系统文件的大小,一般为 2GB。


4.关于count(*)

InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from table 时,InnoDB要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。

 注意,当count(*)语句包含where条件时,两种表的操作是一样的。

5.并发控制

Innodb支持MVCC机制,也就是多并发版本控制,提供提交、回滚、崩溃恢复能力的事务安全(ACID)能力,实现并发控制。

6.索引区别

MyISAM索引文件和数据文件是分离的,索引文件的data域保存记录所在页的地址(物理存储位置),通过这些地址来读取页,进而读取被索引的行数据。
MYSQL中的MyISAM与InnoDB存储引擎区别整理_第2张图片
Innodb也是用B+树来构造索引, 区别在于,InnoDB 存储引擎采用“聚集索引”的数据存储方式实现B-Tree索引。

  • 聚集索引(clustered index)就是按照每张表的主键构造一棵B+树,树中的叶子节点存放着表中的行记录数据也就是数据行和相邻的键值紧凑地存储在一起。
    MYSQL中的MyISAM与InnoDB存储引擎区别整理_第3张图片
  • 辅助索引(不用主键查询):InnoDB对辅助索引采取的方式是在叶子页中保存主键值,通过这个主键值来回表查询到一条完整记录,所以按辅助索引检索实际上进行了二次查询,效率肯定是没有按照主键检索高的。下图是辅助索引的实现方式:
    MYSQL中的MyISAM与InnoDB存储引擎区别整理_第4张图片

三.如何选择

MyISAM适合:

  • 做很多count 的计算;
  • 插入不频繁,查询非常频繁,如果执行大量的SELECT,MyISAM是更好的选择;
  • 没有事务。

InnoDB适合:

  • 可靠性要求比较高,或者要求事务;
  • 表更新和查询都相当的频繁,并且表锁定的机会比较大的情况指定数据引擎的创建;
  • 如果你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表;
  • DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的 删除;
  • LOAD TABLE FROM MASTER操作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的表不适用。

四.总结

1).MyISAM存储引擎的特点是:表级锁、不支持事务和支持全文索引,适合一些CMS内容管理系统作为后台数据库使用,但是使用大并发、重负荷生产系统上,表锁结构的特性就显得力不从心;

2).InnoDB存储引擎的特点是:行级锁、事务安全(ACID兼容)、支持外键、不支持FULLTEXT类型的索引(5.6.4以后版本开始支持FULLTEXT类型的索引)。InnoDB存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全存储引擎。InnoDB是为处理巨大量时拥有最大性能而设计的。它的CPU效率可能是任何其他基于磁盘的关系数据库引擎所不能匹敌的。

上一张图:
MYSQL中的MyISAM与InnoDB存储引擎区别整理_第5张图片


五.补充

MyISAM采用非聚簇索引的好处:数据存放位置固定,集中管理,假如有索引是(a,b,c),那么如果根据b,c这种非主键来查询效率更高。

你可能感兴趣的:(MySQL数据库及其优化)