前面三篇内容都是讲究的主键索引,那么非主键索引底层是什么结构呢?
首先我们创建一张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+树里面的节点内容不一样。
好了,每次学习一个知识点,省时省力好吸收!
欢迎评论、点赞、加关注,下篇文章我们讲解联合索引底层是什么样的?生产中最常用的就是联合索引了。