表`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 协议》,转载必须注明作者和本文链接
推荐文章: