表`t`的XDES Entry結構檔案分析

so_easy發表於2020-09-21

前言

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

本作品採用《CC 協議》,轉載必須註明作者和本文連結
阿門阿前一棵葡萄樹 阿嫩阿嫩綠地剛發芽 蝸牛揹著那重重的殼呀 一步一步地往上爬

相關文章