26. B-Tree 有哪些索引类型?
在 B+Tree 中,根据叶子节点的内容,索引类型分为主键索引和非主键索引。
注意,这里的索引类型,和上面的索引类型,还是对的上的噢。
主键索引的叶子节点存的数据是整行数据( 即具体数据 )。在 InnoDB 里,主键索引也被称为聚集索引(clustered index)。
非主键索引的叶子节点存的数据是整行数据的主键,键值是索引。在 InnoDB 里,非主键索引也被称为
辅助索引
(secondary index)。
二级索引的叶节点存储的是主键值,而不是行指针,这是为了减少当出现行移动或数据页分裂时二级索引的维护工作,但会让二级索引占用更多的空间。
辅助索引与聚集索引的区别在于辅助索引的叶子节点并不包含行记录的全部数据,而是存储相应行数据的聚集索引键,即主键。当通过辅助索引来查询数据时,需要进过两步:
- 首先,InnoDB 存储引擎会遍历辅助索引找到主键。
- 然后,再通过主键在聚集索引中找到完整的行记录数据。
另外,InnoDB 通过主键聚簇数据,如果没有定义主键,会选择一个唯一的非空索引代替,如果没有这样的索引,会隐式定义个主键作为聚簇索引。
再另外,可能有胖友有、疑惑,在辅助索引如果相同的索引怎么存储?最终存储到 B+Tree 非子节点中时,它们对应的主键 ID 是不同的,所以妥妥的。如下图所示:
相同的索引怎么存储