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

File Header(38B):Space Header(112B):XDES Entry(40B):
List Base Node:链表的基点。指向extent链表的头尾指针。具体含义如下图:

结合下图感受下面的分析:
开始分析
XDES Entry在FSP_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 AA’ 00 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为
02的Segment。 - 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 FF’ 00 00
同理可以得到:null –> XDES Entry 04 –> XDES Entry 05 –> null
思考:一个索引分两段,两段也就对应两个
INode Entry,INode Entry内管理了3个链表:FREE,NOT_FULL和FULL链表。这些链表也是对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 协议》,转载必须注明作者和本文链接
关于 LearnKu
推荐文章: