前言
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 協議》,轉載必須註明作者和本文連結