索引查询数据过程

Bertha 。 2023-10-13 09:13 77阅读 0赞

索引查询数据过程

  • MyISAM存储引擎索引查找的过程
  • InnoDB存储引擎索引查找的过程
    • 聚簇索引
    • 辅助索引
  • 对比
  • 拓展

MyISAM存储引擎索引查找的过程

索引文件和数据文件是分开存储的。
在这里插入图片描述
左边这个是一个B+树,这个B+树的每一个节点就是我们的主键ID,这个15、56、77就是他的主键id,然后B+树的最后一层,他是这个叶子节点,大家看一下这个叶子节点上面存储的数据:他这里存放的是数据的地址。

InnoDB存储引擎索引查找的过程

在这里插入图片描述
聚簇索引是通过这个id主键索引去实现的。那么复合索引、单值索引他们统称为辅助索引。所以左边这张图的话,他是一个主键索引,也叫聚簇索引,然后右边这个图他是一个辅助索引。

聚簇索引

在这里插入图片描述
先来看左边这个图,这个innodb他同样是一个B+树的一个结构,然后B+树的每一个节点他是存储的这个id主键的数据。15、56、77这些都是主键id,然后B+树的最后一层这个叶子节点,可以发现这个叶子结点上存储的这个数据,他不是像之前的那个物理地址,而是存储的这个真实数据。

就是说如果我查找这个id等于15,我找到这个叶子节点之后我能一下子把这个15这一行的数据全部拿出来。

这就是innodb和myisam的一个区别。

辅助索引

在这里插入图片描述

这里我们把这个userName这个字段建立成一个索引,就是一个普通的一个辅助索引,那么我们来看一下这个辅助索引的B+树结构。

这个B+树中每个节点存储的是这个相应的名字,然后B+树的最后一层的这个叶子节点一看一下,他这里存储的数据是这个主键id值,这个就是聚簇索引和辅助索引的一个区别。

左边这个聚簇索引存储的是一整行的数据,而右边的这个辅助索引,它存储的只有这个id主键值。

我们想查找名字为Jim的这个数据,首先我们通过这个B+树,找到这个Jim节点,然后Jim节点他对应的这个主键id是20,他拿到id等于20的这个主键,再来左边的这个索引树来查找这个相应的数据。

因为左边的这个聚簇索引,他存储了一整行的数据,我们可以直接就拿出来这个数据。他就通过这个B+树的结构,找到这个20,然后把20他对应的一整行数据就拿出来了。

对比

MyISAM他无论是主键索引还是这个普通索引,他这个查找数据的流程全部都是一样的。

都是先找到这个数据的地址,然后再去通过地址找数据。

然后这个InnoDB就分成两种情况,一种是这个聚簇索引,也就是这个主键索引,另一种就是这个辅助索引。

如果我们直接通过这个主键索引去查询数据,那么他的速度肯定比这个myisam的速度要快。因为他一下就拿出来这个数据了。但是这个辅助索引他要通过两次才能找到这个真实的数据。

所以他在一定程度上会比这个myisam要慢一些。

拓展

为什么不能使用这个select *,为什么要求大家尽量去使用这个覆盖索引,比如说下面这条语句:
在这里插入图片描述
如果不是select *的话,如果我只想查他的id,那么我是不是通过一次查询就查询出来了。

我就不用再通过第二次查询了,如果这里我们需要查询他的age字段,但是age字段不是他的索引字段,所以这里就需要经过两次查询。

所以这个查询效率就会慢一些。这也是为什么走覆盖索引他的效率更高的原因。

但是在我们真实的一些业务场景中,不可能所有的语句都要走覆盖索引。所以这也是不可避免的一个问题。

参考资料:我来告诉你,MySQL是如何通过【索引】找到一条【真实的数据】

发表评论

表情:
评论列表 (有 0 条评论,77人围观)

还没有评论,来说两句吧...

相关阅读