优秀的编程知识分享平台

网站首页 > 技术文章 正文

对比主键索引底层的B+树,非主键索引底层有什么不同?

nanyue 2024-07-30 03:24:54 技术文章 10 ℃

前面三篇内容都是讲究的主键索引,那么非主键索引底层是什么结构呢?

首先我们创建一张table,并添加相关数据


该表有三个字段studentId、name、age,其中studentId为自增主键。我们前面讲解的3篇文章都是以studentId这个自增主键为基础创建索引,我们将该类索引称为主键索引。根据前面的知识我们知道,该索引底层是用B+tree的数据结构来存储索引的。如果我们用name字段来创建索引,此时该索引称为非主键索引。那么非主键索引底层是怎么存储的呢?

首先,如果在创建图1表的时候,表引擎选择InnoDb。例如我们用name列创建索引和主键索引进行对比,如下图


通过分析图2,我们可以看到主键索引和非主键索引的区别就在于B+树叶子节点所跟的值不一样,当查询条件为name=’xiaxue’的时候,首先回去非主键索引的B+树种查询到该值,然后获取到叶子节点的值,在通过该值去主键索引构建的B+树中去查找对应的全部数据。

特殊说明:我们这个在创建这个表的时候,选择了主键,所以mysql在构建这个B+树的时候默认会选择这个主键去构建主键索引,如果我们没有设置主键,那怎么办那?此时Mysql就会在表中选择一列去构建这个这个B+树,选择的则列需要符合唯一性等相关属性,如果找到合适的的列就会用该列创建整张表的聚簇索引,那么非聚簇索引B+树叶子节点跟的值就是对应该列的值,如果整张表都找不到满足条件的的列,mysql数据库则会设置一个隐藏列rowId,用这个rouId列来构建这个B+树,此时非聚集索引B+树叶子节点所跟的值就是这个rowId。

如果在创建图1表的时候,表引擎选择MyISAM,此时主键索引和非主键索引底层存储的方式都是一样的,见下图

通过图3我们可以看到,当表引擎为MyISAM的时候,此此时主键索引和非主键索引底层存储的方式都是一样的,只是B+树里面的节点内容不一样。

好了,每次学习一个知识点,省时省力好吸收!

欢迎评论、点赞、加关注,下篇文章我们讲解联合索引底层是什么样的?生产中最常用的就是联合索引了。

最近发表
标签列表