前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >新增数据时,MySQL索引树的自调整过程

新增数据时,MySQL索引树的自调整过程

作者头像
JavaEdge
发布2022-02-20 09:16:16
5440
发布2022-02-20 09:16:16
举报
文章被收录于专栏:JavaEdgeJavaEdge

刚开始你一个表建好后,就一个数据页,就是聚簇索引的一部分,而且还是空的。若你插入数据,就是直接往这数据页里插入,也没必要给他弄索引页:

初始数据页就是个根页,每个数据页内部默认就有一个基于主键的页目录,所以根据主键查找都没问题,直接在这唯一一个数据页里根据页目录找。

但随着表里数据越来越多,你的数据页满了,就要搞个新数据页,将你根页面里的数据都拷贝过去,同时再搞一个新的数据页,根据你的主键值的大小进行挪动,让两个新的数据页根据主键值排序,第二个数据页的主键值都大于第一个数据页的主键值:

此时根页就升级为索引页了,这根页里存放:

  • 两个数据页的页号
  • 他们里面最小的主键值

所以此时看起来根页就成为了索引页,引用了两个数据页。

随着你不停插数据,然后数据页不停地页分裂,分裂出来更多的数据页。你唯一这个索引页,即根页里存放的数据页索引条目越来越多,连你的索引页都放不下了,那就让一个索引页分裂成两个索引页,然后根页继续往上走一个层级,引用两个索引页。

数据页越来越多,那根页指向的索引页也不停分裂,分裂出更多索引页,当你下层索引页数量太多时,会导致你的根页指向的索引页太多,根页继续分裂成多个索引页,根页再次上移一个层级。这就是你增删改时,整个聚簇索引维护的一个过程。

二级索引

同理,比如你name字段有一个索引,那么刚开始的时候你插入数据,一方面在聚簇索引的唯一的数据页里插入,一方面在name字段的索引B+树唯一的数据页里插入。

随着后续数据越来越多,name索引树里唯一的数据页也会分裂,整个分裂的过程跟上面一样,所以你插入数据的时候,本身就会自动维护你的各索引树。

你的name字段的索引B+树里的索引页中,其实除了存放页号和最小name字段值以外,每个索引页里还会存放那个最小name字段值对应的主键值。因为有时会出现多个索引页指向的下层页号的最小name字段值一样,就得根据主键判断。

比如插入一个新的name值,他需要根据name索引树的根页开始,逐层查找自己这个新的name值应该插入到叶节点的哪个数据页。

万一遇到同层里不同索引页指向不同的下层页号,但name值一样,就得根据主键值比较:新的name值插入到主键值较大的那个数据页里!

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-02-19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 二级索引
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档