首先要明确,MyISAM和Innodb引擎的索引底层都是由B+树实现的。
一、聚簇索引和非聚簇索引
Innodb引擎:叶节点存放一整行记录的索引
叫聚集索引。
MyISAM引擎:叶子结点存放磁盘地址的索引叫做非聚簇索引。
二、Innodb引擎和MyISAM引擎中索引的区别
设有数据库表:主键为id,列为 name(索引),class,age
Innodb
- 按照主键B+树的排列方式存放,子节点存放的就是数据。(如果没有主键,以第一列为聚集索引)
- 只有一个聚集索引。
- 普通索引指向聚集索引。
叶子节点存放的是:除该索引外的一整行数据
聚簇索引结构:
下图叶节点包含了完整的数据记录InnoDB的数据文件本身就是索引文件,而MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。而在InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶节点data域保存了完整的数据记录。这个索引的key是表的主键,因此InnoDB表数据文件本身就是主键索引。
这里InnoDB必须要有主键,因为数据文件要根据主键才能组合成一个索引结构,所以InnoDB要求表必须有主键(MyISAM可以没有),如果没有显式指定,则MySQL系统会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在这种列,则MySQL自动为InnoDB表生成一个隐含字段作为主键,这个字段长度为6个字节,类型为长整形
而也可能会有很多普通索引,普通索引的子节点指向聚集索引。例如当普通索引通过xiaohuang查到id为1后,再到聚集索引中继续查询到子节点,也就是说通过普通索引查询会调用两次索引。
MyIsam
- 普通索引和非聚集索引没什么区别。
叶子节点存放的是:磁盘地址
。
叶节点的data域存放的是数据记录的地址。MyISAM的索引与行记录是分开存储的,叫做非聚集索引(UnClustered Index)。可以想象成一本书的目录和内容是分开的。