MySQL两种存储引擎: MyISAM和InnoDB 简单总结

1.简单介绍

MyISAM是MySQL的默认数据库引擎(5.5版之前),由早期的ISAM(Indexed Sequential Access Method:有索引的顺序访问方法)所改良。虽然性能极佳,但却有一个缺点:不支持事务处理(transaction)。不过,在这几年的发展下,MySQL也导入了InnoDB(另一种数据库引擎),以强化参考完整性与并发违规处理机制,后来就逐渐取代MyISAM。

InnoDB,是MySQL的数据库引擎之一,为MySQL AB发布binary的标准之一。InnoDB由Innobase Oy公司所开发,2006年五月时由甲骨文公司并购。与传统的ISAM与MyISAM相比,InnoDB的最大特色就是支持了ACID兼容的事务(Transaction)功能,类似于PostgreSQL。目前InnoDB采用双轨制授权,一是GPL授权,另一是专有软件授权。

2.MyISAM和InnoDB两者之间的明显区别:

简单梳理如下
1) 事务支持
MyISAM不支持事务,而InnoDB支持。InnoDB的AUTOCOMMIT默认是打开的,即每条SQL语句会默认被封装成一个事务,自动提交,这样会影响速度,所以最好是把多条SQL语句显示放在begin和commit之间,组成一个事务去提交。

MyISAM是非事务安全型的,而InnoDB是事务安全型的,默认开启自动提交,宜合并事务,一同提交,减小数据库多次提交导致的开销,大大提高性能。

2) 存储结构
MyISAM:每个MyISAM在磁盘上存储成三个文件。文件的名字以表的名字开始,扩展名指出文件类型。.frm文件存储表定义(表的结构文件)。表数据文件的扩展名为.MYD (MYData)。索引文件的扩展名是.MYI (MYIndex)。(重点哦!!!
MyISAM在磁盘上存储的文件的具体体现:
在这里插入图片描述
InnoDB:所有的表(指数据库里面所有的表)都保存在同一个数据文件中(也可能是多个文件,或者是独立的表空间文件 小疑问: 这句话是什么意思啊????是不是说有可能是数据库里面所有的表数据文件都存在一个文件里面,也有可能是分开存?),InnoDB表的大小只受限于操作系统文件的大小,一般为2GB。
在这里插入图片描述
解释: innodb引擎是把索引文件和数据文件存储在一起

3) 存储空间
MyISAM:可被压缩,存储空间较小。支持三种不同的存储格式:静态表(默认,但是注意数据末尾不能有空格,会被去掉)、动态表、压缩表。(小疑问:什么是动态表,什么是压缩表???
InnoDB:需要更多的内存和存储,它会在主内存中建立其专用的缓冲池用于高速缓冲数据和索引。

4) 可移植性、备份及恢复
MyISAM:数据是以文件的形式存储,所以在跨平台的数据转移中会很方便。在备份和恢复时可单独针对某个表进行操作。

InnoDB:免费的方案可以是拷贝数据文件、备份 binlog(二进制日志),或者用 mysqldump,在数据量达到几十G的时候就相对痛苦了。
更多内容还未更新完,请参考下方链接:
http://www.cnblogs.com/kevingrace/p/5685355.html

MySQL索引实现

在MySQL中,索引属于存储引擎级别的概念,不同存储引擎对索引的实现方式是不同的,本文主要讨论MyISAM和InnoDB两个存储引擎的索引实现方式。

1.MyISAM索引实现
MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址。下图是MyISAM索引的原理图:
MySQL两种存储引擎: MyISAM和InnoDB 简单总结_第1张图片
这里设表一共有三列,假设我们以Col1为主键,则上图是一个MyISAM表的主索引(Primary key)示意。可以看出MyISAM的索引文件仅仅保存数据记录的地址在MyISAM中,主索引和辅助索引(Secondary key)在结构上没有任何区别,只是主索引要求key是唯一的,而辅助索引的key可以重复。如果我们在Col2上建立一个辅助索引,则此索引的结构如下图所示:
小疑问:笔者从下图并没有看出辅助索引的key重复情况,只不过是下图没有把辅助索引的key重复的情况画出来而已)
MySQL两种存储引擎: MyISAM和InnoDB 简单总结_第2张图片
同样辅助索引的数据结构也是一棵B+树,data域保存数据记录的地址。因此,MyISAM中索引检索的算法为首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,则取出其data域的值,然后以data域的值为地址,读取相应数据记录。

MyISAM的索引方式也叫做“非聚集”的,之所以这么称呼是为了与InnoDB的聚集索引区分

2.InnoDB索引实现
虽然InnoDB也使用B+Tree作为索引结构,但具体实现方式却与MyISAM截然不同
第一个重大区别是InnoDB的数据文件本身就是索引文件。从上文知道,MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。而在InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。(可以根据下图来理解
MySQL两种存储引擎: MyISAM和InnoDB 简单总结_第3张图片
上图是InnoDB主索引(同时也是数据文件)的示意图,可以看到叶节点包含了完整的数据记录。这种索引叫做聚集索引因为InnoDB的数据文件本身要按主键聚集,所以InnoDB要求表必须有主键(MyISAM可以没有)解释:InnoDB存储引擎是表数据文件和索引文件是一个总文件,相比于MyISAM而言,InnoDB把表数据文件和索引文件融合成了一个文件),如果没有显式指定,则MySQL系统会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在这种列,则MySQL自动为InnoDB表生成一个隐含字段作为主键,这个字段长度为6个字节,类型为长整型。
第二个与MyISAM索引的不同是InnoDB的辅助索引data域存储相应记录主键的值而不是地址。换句话说,InnoDB的所有辅助索引都引用主键作为data域。例如,下图为定义在Col3上的一个辅助索引:
MySQL两种存储引擎: MyISAM和InnoDB 简单总结_第4张图片
MySQL两种存储引擎: MyISAM和InnoDB 简单总结_第5张图片
这里以英文字符的ASCII码作为比较准则。聚集索引(解释:就是把表数据文件和索引融合成一个总文件的方式这种实现方式使得按主键的搜索十分高效,但是辅助索引搜索需要检索两遍索引:首先检索辅助索引获得主键,然后用主键到主索引中检索获得记录。

了解不同存储引擎的索引实现方式对于正确使用和优化索引都非常有帮助,例如知道了InnoDB的索引实现后,就很容易明白为什么不建议使用过长的字段作为主键,因为所有辅助索引都引用主索引,过长的主索引会令辅助索引变得过大。再例如,用非单调的字段作为主键在InnoDB中不是个好主意,因为InnoDB数据文件本身是一棵B+Tree,非单调的主键会造成在插入新记录时数据文件为了维持B+Tree的特性而频繁的分裂调整(解释:如果我们的主键是单调的,那就不会分裂调整B+Tree的结构,而如果主键是非单调的话,那就很有可能调整B+Tree的结构(跟平衡二叉树一样,为了起到平衡整颗树的形状而调整结构)),十分低效,而使用自增字段作为主键则是一个很好的选择。

你可能感兴趣的:(数据库系列)