咱们曾经晓得数据页的格局是这样的:

假如咱们要查问一个名字叫做张三的人,咱们是这样查的:

  • 查找第一个数据页的第一条数据,依据形容数据的变长字段的长度列表和null值列表定位字段的值,进行匹配操作。
  • 依据形容数据的next_record找到第二条数据,同下面的匹配操作。
  • 以后数据页查找完了,依据数据页指向下一个数据页进行下面2个步骤操作。

所以这周非索引的,就相当于全表扫描,他会一个个数据页的每行进行查找。
如果咱们查找主键id为45的数据呢(假如每个数据页10条),咱们是这样查的:

  • 通过索引找到数据页,此时数据页的id范畴为41-50。
  • 而后依据二分查找定位到id为45的数据。

这个查找包含了两个货色,一个是主键,是递增的,所以咱们在定位到数据页的时候,能够用二分查找。另外一个就是索引,MySql的索引是B+树结构,索引又分为聚族索引跟非聚族索引。
索引在磁盘中,也是通过数据页的模式,所以id=45查找的过程是这样的:
在最顶层的数据页中查找,发现45比101还小,所以他就往左边的数据页查找。
而后比照45和51,发现比51小,于是就定位数据页4。
而后在数据页4中,通过二分查找到45的id。

对于非聚族索引,查找的过程也是相似的,不同的他的叶子节点存储的是索引对应的列的值以及索引的值,所以他还要通过索引的值持续下面的操作,也就是回表。