如题,废话不多说,
首先两者都是使用B+树作为底层的数据结构的。
下图是MyISAM索引的原理图(图是网上找的。。。):
这个图就很明显了:
1,叶节点的data域存放的是数据记录的地址。MyISAM的索引与行记录是分开存储的,叫做非聚集索引(UnClustered Index)。col1,col2,col3数据是独立额外存储的。索引是单独的,我的理解就是一本书的目录和里面的内容是独立的,叶子节点只有一个页码。
2,上面没有的键值对应着col1里面的值,这是以col1作为主键的结果,同样你也可以把col2设为主键,那结构图如下:
MyISAM的索引方式也叫做“非聚集”的,之所以这么称呼是为了与InnoDB的聚集索引区分。
InnoDB索引实现
虽然InnoDB也使用B+Tree作为索引结构,但具体实现方式却与MyISAM截然不同。
首先:可以看到叶节点包含了完整的数据记录。这种索引叫做聚集索引。InnoDB的数据文件本身就是索引文件!!!从上文知道,MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。而在InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶节点data域保存了完整的数据记录。这个索引的key是表的主键,因此InnoDB表数据文件本身就是主键索引。
这里InnoDB必须要有主键,因为数据文件要根据主键才能组合成一个索引结构,所以InnoDB要求表必须有主键(MyISAM可以没有),如果没有显式指定,则MySQL系统会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在这种列,则MySQL自动为InnoDB表生成一个隐含字段作为主键,这个字段长度为6个字节,类型为长整形。
下面再说说不同索引在这两种引擎中的差别.
主要的索引如下:
普通索引:最基本的索引,没有任何限制
唯一索引:与”普通索引”类似,不同的就是:索引列的值必须唯一,但允许有空值。
主键索引:它 是一种特殊的唯一索引,不允许有空值。
全文索引:仅可用于 MyISAM 表,针对较大的数据,生成全文索引很耗时好空间。
组合索引:为了更多的提高mysql效率可建立组合索引,遵循”最左前缀“原则。
这里主要是普通索引和主键索引的区别;
MyISAM
-主键索引/非主键索引
叶子节点上均带有行号,通过行号进行索引(行号即数据的地址指针)
主键索引与普通索引无太大区别。
InnoDB
-主键索引(聚簇索引) 叶子节点上带有数据
-非主键索引(第二索引) 叶子节点上带有主键的key(既不是数据也不是地址!)
InnoDB的聚集索引存储数据行本身,普通索引存储主键
因而对于InnoDB表,可以看到:
(1)不建议使用过长 的字段作为主键,因为所有辅助索引都引用主索引,过长的主索引会令辅助索引变得过大;
(2)建议使用趋势递增的key做主键,由于数据行与索引一体,这样不至于插入记录时,有大量索引分裂,行记录移动。非单调的主键会造成在插入新记录时数据文件为了维持B+Tree的特性而频繁的分裂调整树结构,从而影响性能;