咱们曾经晓得数据页的格局是这样的:
假如咱们要查问一个名字叫做张三的人,咱们是这样查的:
- 查找第一个数据页的第一条数据,依据形容数据的变长字段的长度列表和 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。
对于非聚族索引,查找的过程也是相似的,不同的他的叶子节点存储的是索引对应的列的值以及索引的值,所以他还要通过索引的值持续下面的操作,也就是回表。