Mysql的索引分析(2)

80 阅读2分钟

聚簇索引

首先呢,现在假设我们需要搜索一个id=30对应的一行数据。我们应该先去顶层索引页(89)里去找,然后通过二分查找就找到下级索引页。如下图: 其实索引树内部对于同一层级的索引页间是基于指针,双向链表连接。其实数据页和索引页都是连在一起的不知道大家发现没有。在最底层的索引页与数据页是通过指针连接起来的,也可以说最底层就是数据页。结论是一个B+树索引结构里底层的叶子节点就是数据页那么它就是聚簇索引。当你在插入数据的时候如果产生了也分裂,它会保证你后主键id从小到大的有序性。如果一个表里的数据太多。 一个索引页放不下那么会生成新的索引页然后生成上层索引页,而上层索引页会记录下次索引页及对应的最小主键值。 普通索引

其实普通索引也是一个B+树,它是独立于聚簇索引之外的另外一棵树,但是它的叶子节点存储的就不是真实数据了。而是id和索引字段,比如我们对Name 字段进行索引创建,底层叶子节点就是id->Name。 索引如何维护的

  1. 你现在有一个新创建的表它没有数据,现在他就一个数据页。这个数据页属于聚簇索引的一部分到现在为止还是空的。

  2. 这个时候你插入数据就往数据页里写入,现在也不会有什么索引页。然后这个数据页其实就是根页,每个数据页的内部都有一个基于主键的页目录。查询时也OK直接找页目录就可以了。

  3. 然后数据越来越多就会生成另一个数据页,并进行页分裂按照主键大小排序。 这个是页根在哪里? 这个时候页根就成为索引页了,索引页里记录的就是最小主键id和数据页号了。并引用两个数据页。

  4. 接着不断插入数据数据越来越多,一个索引页放不下就会把页根上移会有很多的索引页就有了层级关系。最终就变为了一个B+数。