图解MySQL页分裂

这一篇博客我们来讲一下页分裂,先抛出一个问题,就是MySQL为什么不推荐使用UUID作为主键?

这个我相信大家都知道,因为UUID生成是无序的,而主键最好是自增的,或者有顺序的,至于为什么要这样呢,其实就是因为MySQL会存在页分裂

既然数据页会分裂,那么具体是怎么分裂?分裂成什么样的呢?

首先来一个数据页的图:
数据页
上面就是数据页的结构了,首先两个数据页之间会有指针指向上一个和下一个数据页,形成一个双向链表,在数据页中存储的就是一行行的数据了,每个数据行之间会有单向指针连接,组成一个单向链表

我们还可以看到图中有一些数字,这些代表的是这行数据行的类型,第一行的行类型是2,就说明这一行是起始行,代表最小的一行,指针指向了下一行的数据;接下来的数据行的行类型是0,也就是普通的数据行,里面存储了各种字段;最后一行的行类型是3,代表了最大的一行

当一个数据页中的数据行太多放不下的下,就会生成一个新的数据页来存储,同时使用双向链表来相连

关键点来了,当我们使用索引的时候,有一个最基础的条件就是后面数据页中的数据行的主键值需要大于前一个数据页中数据行的主键值,至于为什么要这么做,其实索引简单来说,其实就是通过二分法不断减少要筛选的数据,而主键值就是筛选的标准,以尽快定位到我们需要的数据

所以如果我们设置的主键是乱序的,就有可能会导致数据页中的主键值大小不能满足索引使用的条件,此时就会产生页分裂,我们假设有如下图的数据页:
乱序数据页
如果出现上图的数据页,我们可以发现后面数据页里的主键值比前一个数据页的主键值要小,里面的数据就会进行数据的挪动,也就是页分裂
页分裂
通过页分裂,我们只要将主键为2的数据行与主键值为4的数据行互相挪动一下位置,就可以保证后面一个数据页的主键值比前一个数据页中的主键值大了,真正的页分裂可能比图中要复杂很多,但是都是通过这种形式来完成页分裂的

结论就是主键值最好是有序的,这样就可以不用页分裂,还能充分使用到索引,否则就必须进行页分裂来保证索引的使用

  • 14
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值