MyISAM引擎使用B+树做为索引结果,叶节点的data域存放的是数据记录的地址。下图为MyISAM表的主索引,Col1为主键。mysql
在MyISAM中,主索引和辅助索引在结构上没有任何区别,只是主索引要求key是惟一的,而辅助索引的key能够重复。下图在Col2上创建一个辅助索引算法
一样也是一颗B+Tree,data域保存数据记录的地址。所以,MyISAM中索引检索的算法为首先按照B+Tree搜索算法搜索索引,若是指定的Key存在,则取出其data域的值,而后以data域的值为地址,读取相应数据记录。sql
MyISAM的索引方式也叫作“非汇集”的,之因此这么称呼是为了与InnoDB的汇集索引区分。性能
一样是B+树,实现方式却彻底不一样。InnoDB表数据文件自己就是一个索引结构,树的叶节点data域保存了完整的数据记录,这种索引叫作汇集索引。优化
由于InnoDB的数据文件自己要按主键汇集,因此InnoDB要求表必须有主键(MyISAM能够没有),若是没有显式指定,则mysql会自动选择一个能够惟一标识数据记录的列做为主键。若是不存在这种列,则mysql自动为InnoDB表生成一个隐含字段做为主键,这个字段长度为6个字节,类型为长整型。插件
InnoDB的全部辅助索引都引用主键做为data域。下图为定义在Col3上的一个辅助索引blog
所以InnoDB 的索引能提供一种很是快速的主键查找性能。不过,它的辅助索引也会包含主键列,因此若是主键定义的比较大,其余索引也将很大。InnoDB 不会压缩索引。索引
汇集索引这种实现方式使得按主键的搜索十分高效,可是辅助索引搜索须要检索两遍索引:首先检索辅助索引得到主键,而后用主键到主索引中检索得到记录。事务
不一样存储引擎的索引实现方式对于正确使用和优化索引都很是有帮助,例如知道了InnoDB的索引实现后,就很容易明白为何不建议使用过长的字段做为主键,由于全部辅助索引都引用主索引,过长的主索引会令辅助索引变得过大。再例如,用非单调的字段做为主键在InnoDB中不是个好主意,由于InnoDB数据文件自己是一颗B+Tree,非单调的主键会形成在插入新记录时数据文件为了维持B+Tree的特性而频繁的分裂调整,十分低效,而使用自增字段做为主键则是一个很好的选择。搜索
InnoDB的数据文件自己就是主索引文件。而MyISAM的主索引和数据是分开的。
InnoDB的辅助索引data域存储相应记录主键的值而不是地址。而MyISAM的辅助索引和主索引没有多大区别。
innoDB是聚簇索引,数据挂在逐渐索引之下。
MyISAM使用的是表锁
InnoDB使用行锁
MyISAM没有事务支持和MVCC
InnoDB支持事务和MVCC
MyISAM支持FULLTEXT类型的全文索引
InnoDB不支持FULLTEXT类型的全文索引,可是InnoDB可使用sphinx插件支持全文索引,而且效果更好
MyISAM容许没有任何索引和主键的表存在,索引都是保存行的地址
InnoDB若是没有设定主键或非空惟一索引,就会自动生成一个6字节的主键,数据是主索引的一部分,附加索引保存的是主索引的值
MyISAM不支持
InnoDB支持
未完待续