暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

字节跳动面试之MySQL索引详细讲解

走进Java 2021-06-21
378

什么是聚集索引?在 MySQL 中,B+ 树索引按照存储方式的不同分为聚集索引和非聚集索引。

这里我们着重介绍 InnoDB 中的聚集索引和非聚集索引:

聚集索引(聚簇索引):以 InnoDB 作为存储引擎的表,表中的数据都会有一个主键,即使你不创建主键,系统也会帮你创建一个隐式的主键。

这是因为 InnoDB 是把数据存放在 B+ 树中的,而 B+ 树的键值就是主键,在 B+ 树的叶子节点中,存储了表中所有的数据

这种以主键作为 B+ 树索引的键值而构建的 B+ 树索引,我们称之为聚集索引。

非聚集索引(非聚簇索引):以主键以外的列值作为键值构建的 B+ 树索引,我们称之为非聚集索引。

非聚集索引与聚集索引的区别在于非聚集索引的叶子节点不存储表中的数据,而是存储该列对应的主键,想要查找数据我们还需要根据主键再去聚集索引中进行查找,这个再根据聚集索引查找数据的过程,我们称为回表。

在InnoDB中,主键索引即聚集索引。在MySAM中,主键索引也不是聚集索引。在MySAM中索引与数据是分开的。MySAM中存储结构是索引Key ---> 行数据磁盘文件地址

上图:MySQL InnoDB主键索引结构图,在InnoDB中,主键索引组织的索引结构,叶子节点保存了所有数据,且是排好序的。就代表了我们通过主键查询的时候,通过主键索引的B+树可以拿到我们所有的数据。因为MySQL中,所有的叶子节点都是一个双向链表,且是排好序的,那么在范围查找时,效率依然非常之高。

在举个例子,如果我们查看id=0的,0<2,在节点的左边。0<1,在1的左边。发现没有数据。那么我们也就无需在担心和顾虑后续的节点会不会存在。这就是为什么要排好序的原因。

非聚集索引存储的具体的索引字段信息,而叶子节点存储主键索引+数据,为了要找到“zhangsan”这行数据,需要先在非聚集索引中找到对应的主键,再根据主键索引,查找对应的行数据,等于走了两遍B+树进行搜索,效率上肯定比主键索引低。


覆盖索引:

覆盖索引,首先看一下它的定义:如果查询的列字段在索引关键字中能找到则直接返回。

如果查询的列中能全部匹配索引关键字,则直接返回对应索引的数据,那么此时就不用在根据索引的主键

在聚集索引中再查找一遍,等于覆盖索引能减少IO操作,所以我们在某些特殊场景下,如果只查索引列的字段,建议可以使用覆盖索引,能大幅度提供查询性能。


文章转载自走进Java,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论