MySQL:插入数据时,是如何维护好不同索引的B+树的

  • 首先在刚开始创建好一个表之后,这个表本质就是一个数据页,这个数据页是属于聚簇索引的一部分,而且目前还是空的。
    +此时如果你插入数据,就是直接在这个数据页里插入就可以了,也没有必要给它弄什么索引页。
    在这里插入图片描述

  • 这个初始的数据页其实就是一个根页,每个数据页内部默认就有一个基于主键的页目录,所以此时你根据主键来搜索都是OK的,直接在唯一一个数据页里根据页目录找就行了

  • 然后表里的数据越来越多了,此时你的数据页满了,那么就会申请一个新的数据页,然后把你跟页面里的数据都拷贝过去,同时再申请一个新的数据页,根据你的主键值的大小进行挪动,让两个新的数据页根据主键值排序,第二个数据页的主键值都大于第一个数据页的主键值。如下图:

在这里插入图片描述

  • 那此时那个根页在哪儿呢?此时根页就升级为索引页了,这个根页里放的是两个数据页的页号和它们最小的主键值,而且这个根页会引用两个数据页。

在这里插入图片描述

  • 接下来会不停的往表中插入数据,然后数据页不停的页分裂,分裂出来越来越多的数据页
  • 此时你的唯一的那个索引页,也就是根页里存放的数据页索引越来越多,超出了这个索引页可以存放的条数。
  • 这时就会让一个索引页分裂成两个索引页,然后根页继续往上走一个层级引用了两个索引页。

在这里插入图片描述

  • 以此类推,数据页越来越多,那么根页指向的索引页也会不停的分裂,分裂出更多的索引页,当你下层的索引页数量太大的时候,会导致你的根页指向的索引页太多了,此时根页继续分裂成多个索引页,根页再次往上提一个层级。

这就是增删改的时候,整个聚簇索引维护的一个过程。其他的二级索引也是类似的一个原理。

  • 比如如果name字段有一个索引,那么刚开始的时候你插入数据,一方面在聚簇索引的唯一的数据页里插入,一方面在name字段的索引B+树唯一的数据页里插入。
  • 然后后继的数据越来越多了,name字段的索引B+树里唯一的数据页也会分裂,整个分裂的过程跟上面过程是一样的。所以你插入数据的时候,本身就会自动去维护你的各个索引的B+数
  • 另外,name字段的索引B+树里的索引页中,其实除了存放页号和最小name字段值以外,每个索引页里还会存放那个最小name字段值对应的主键值
  • 这是因为有时候会出现多个索引页指向的下层页号的最小name字段值是一样的,此时就必须根据主键判断一下。
  • 比如你插入了一个新的name字段值,此时还需要根据name字段的B+树索引的跟页面开始,去逐层寻找和定位自己这个新的name字段值应该插入到叶子节点的哪个数据页里去。
  • 此时万一遇到一层里不同的索引页指向不同的下层页号,但是name字段值一样,此时就得根据主键值比较一下。
  • 新的name字段值肯定要插入到主键值较大的那个数据页里去
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值