表`t`的XDES Entry结构文件分析

前言

InnoDB从内分析之区和段(三)

  • File Header(38B):
  • Space Header(112B):
  • XDES Entry(40B):

List Base Node:链表的基点。指向extent链表的头尾指针。具体含义如下图:

表`t`的XDES Entry二进制文件分析

结合下图感受下面的分析:
表`t`的XDES Entry二进制文件分析

开始分析

XDES EntryFSP_HDR结构,这个结构是在第一页,始末位置是:0x0000~0x3fff

XDES Entry 01

00000090: 00 00 00 02 00 26’ ‘`00 00 00 00 00 00 00 00` `FF FF
000000a0: FF FF 00 00 FF FF FF FF 00 00` `00 00 00 03` AA AA
000000b0: AA AA AA AA AA AA AA AA AA AA AA AA AA AA00 00
  • Segment ID:0x00。不属于任何的段
  • List Node:默认的指向最后一个Extent
  • State:值为0x03。表示它属于FULL_FRAG链表。表示的是没有剩余页面的碎片区。和Page State Bitmap的值相呼应。
    01:属于FREE链表
    02:属于FREE_FRAG链表
    03:属于FULL_FRAG链表
    04:属于FSEG段链表
  • Page State Bitmap:64个页面都已经写满了。

分析:
从以上可以知道这个XDES Entry表示的Extent是作为了碎片区,并且它的页面已全部写完。

那么FF FF FF FF 00 00指向的是哪个位置呢?FF FF FF FF表示的是页号,一组区有256Extent,一个Extent是64页。所以一共是16384个页面。怎么得到的这个值呢?

XDES Entry 02

000000b0: AA AA AA AA AA AA AA AA AA AA AA AA AA AA’ ‘`00 00
000000c0: 00 00 00 00 00 00` `FF FF FF FF 00 00 FF FF FF FF
000000d0: 00 00` `00 00 00 02` AA AA FE FF FF FF FF FF FF FF
000000e0: FF FF FF FF FF FF’ ‘`00 00 00 00 00 00 00 02` `FF FF
  • Segment ID:0x00。不属于任何的段
  • List Node:默认值
  • State:值为0x02。表示它属于FREE_FRAG链表。有剩余空间的碎片区。和Page State Bitmap相呼应。
  • Page State Bitmap:只有部分页被写满了。二进制表示是1010 1010 1010 1010 1111 1110。12个Page被写了。这里奇怪的一个值是11。因为之前看介绍说第二个标志位没有被启用。

XDES Entry 03

000000e0: FF FF FF FF FF FF’ ‘`00 00 00 00 00 00 00 02` `FF FF
000000f0: FF FF 00 00 FF FF FF FF 00 00` `00 00 00 04` AA AA
00000100: AA FF FF FF FF FF FF FF FF FF FF FF FF FF’ ‘00 00
  • Segment ID:0x02。属于段ID为02Segment
  • List Node:默认值
  • State:值为0x04。表示它属于FSEG链表。
  • Page State Bitmap:只有部分页被写满了。二进制表示是1010 1010 1010 1010 1010 1010。12个Page被写了。

XDES Entry 04

00000100: AA FF FF FF FF FF FF FF FF FF FF FF FF FF’ ‘`00 00
00000110: 00 00 00 00 00 00` `FF FF FF FF 00 00 00 00 00 00
00000120: 01 3E` `00 00 00 01` FF FF FF FF FF FF FF FF FF FF
00000130: FF FF FF FF FF FF’ ‘`00 00 00 00 00 00 00 00` `00 00
  • Segment ID:0x00。
  • List Node:prev指向的是默认的,next指向的是pageNo=0x00,偏移量是0x013E
  • State:值为0x01。表示它属于FREE链表。
  • Page State Bitmap:页面都是空闲的

    一直困扰我的是List Node的页号和偏移量是如何使用的,到底指向了哪个位置?
    pageNo=0x00是表示page offset 0的页?那么offset=0x013E就指向了上述的0x0130这一行的倒数第二个位置。刚好这个XDES Entry就是FREE链表。似乎答案已经找到了:null –> XDES Entry 04 –> XDES Entry 05

XDES Entry 05

00000130: FF FF FF FF FF FF’ ‘`00 00 00 00 00 00 00 00` `00 00
00000140: 00 00 01 16 FF FF FF FF 00 00` `00 00 00 01` FF FF
00000150: FF FF FF FF FF FF FF FF FF FF FF FF FF FF00 00

同理可以得到:null –> XDES Entry 04 –> XDES Entry 05 –> null

思考:一个索引分两段,两段也就对应两个INode EntryINode Entry内管理了3个链表:FREE,NOT_FULLFULL链表。这些链表也是对XDES Entry的管理,那么该怎么解读呢?接下来分析INode

参考

1、 blog.csdn.net/mysql_lover/article/...
2、mysqlserverteam.com/innodb-tablesp...
3、dev.mysql.com/doc/dev/mysql-server...
4、blog.jcole.us/2013/01/04/page-mana...

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!