mysql的页都存了什么

324 阅读2分钟

闲言少叙,直接插入

我们都知道mysql数据库他组织索引的形式是B+tree,并且数据在磁盘上是以页【page】为单位进行存储的,当需要从磁盘中取数据时会一次性读一页的数据出来,那这个页里面的数据是如何进行组织的呢 image.png 页头

  • 记录页面控制信息,共56字节,包括左右兄弟页指针、页面控件使用情况
  • 【也就是说页与页之间是双向链表】

最小/最大虚记录

  • 最大:比页内最大主键还大
  • 最小:比页内最小主键还小
  • 初步判断某数据在不在本页,如果数据超出此最大最小则必不在本页,反之有可能在本页
  • 下文细嗦

记录堆

  • 存储实际记录,记录的存储形式是链表
  • 【注意实际使用中各条数据的长度一般会不一样】
  • 使用链表主要还是为了提高插入性能
  • 缺点是链表不能做二分查找,得遍历

自由空间链表

  • 将记录堆中被删除的空间用链表连接起来,便于快速找到可重复利用的空间
  • 当有新数据要插入时会优先从自由空间链表中寻找放得下的空间来使用,找不到才去使用未分配空间

【所以页内的数据空间一共有俩链表,一个是已用空间的链表,一个是自由空间的链表】 ​

未分配空间:字面意思 ​

slot区:槽位区,等会细嗦 ​

页尾:8字节,存储页校验信息 ​

好的接下来我们细嗦槽位区 image.png slot区是一块连续的内存,分为很多大小一样的slot,每个slot指向一条记录 ​

上面说过记录是以链表形式存储的,slot本质就是将一整条链表分为了好几段 第一个slot指向最小虚记录,最后一个slot指向最大虚记录 理想情况下通过中间的slot平均地将页内的数据一整条链表均分为多条小链表,可以对slot做类似二分查找加快搜索效率【类似跳表】 ​

当需要在这个页里查询数据时,先与最大/最小虚记录比较,若【大于最小虚记录】或【小于最大虚记录】则查询的数据有可能在本页,反之则必不在本页,此之为初步判断 ​

判断查询的数据有可能在本页后,就开始在页内查找,先查插槽区,通过二分查找找到最有可能存在目标数据的插槽,然后只需要遍历链表最有可能存在目标数据的这一段即可