- 論壇徽章:
- 0
|
InnoDB將所有記錄存儲在一個(gè)確定大小的單元中,也就是頁(有時(shí)候也稱為塊)。目前所有頁的大小都是固定的16K。
一個(gè)頁包含有很多記錄,另外也包含Headers和Trailer。下面我們從總體結(jié)構(gòu)上來看看頁的組成。
一個(gè)頁包含七個(gè)部分
Fil Header
Page Header
Infimum + Supremum Records
User Records
Free Space
Page Directory
Fil Trailer
我們可以看到,一個(gè)頁包含兩對header/trailer。里面的一對,Page Header和Page Directory主要涉及到\page program group,外面的一對Fil Header和Fil Trailer主要涉及到\fil program group。Fil Header也被稱為File Page Header。
夾在headers和trailers中間的就是一些記錄和自由(未使用)空間。一個(gè)頁通常開始于兩個(gè)固定的記錄,稱為Infirmum和Supremum,然后就是用戶記錄。在用戶記錄和page directory中間是自由空間,用來存放新的記錄。
Fil Header
Fil Header由八個(gè)部分組成:
Name Size Remarks
FIL_PAGE_SPACE 4 4 ID of the space the page is in
FIL_PAGE_OFFSET 4 ordinal page number from start of space
FIL_PAGE_PREV 4 offset of previous page in key order
FIL_PAGE_NEXT 4 offset of next page in key order
FIL_PAGE_LSN 8 log serial number of page's latest log record
FIL_PAGE_TYPE 2 current defined types are: FIL_PAGE_INDEX, FIL_PAGE_UNDO_LOG, FIL_PAGE_INODE, FIL_PAGE_IBUF_FREE_LIST
FIL_PAGE_FILE_FLUSH_LSN 8 "the file has been flushed to disk at least up to this lsn" (log serial number), valid only on the first page of the file
FIL_PAGE_ARCH_LOG_NO 4 the latest archived log file number at the time that FIL_PAGE_FILE_FLUSH_LSN was written (in the log)
FIL_PAGE_SPACE是一個(gè)很重要的標(biāo)識符,因?yàn)椴煌捻摽赡軐儆谕晃募胁煌目臻g。
空間可能指的是log或表空間。
FIL_PAGE_PREV和FIL_PAGE_NEXT是頁的前后指針,用來指向前一個(gè)頁和后一個(gè)頁。
FIL_PAGE_FILE_FLUSH_LSN, FIL_PAGE_PREV和FIL_PAGE_NEXT都和日志相關(guān)。
FIL_PAGE_FILE_FLUSH_LSN 和FIL_PAGE_ARCH_LOG_NO只在數(shù)據(jù)文件的第一頁有效。
Page Header
Page Header由14個(gè)部分組成:
Name Size Remarks
PAGE_N_DIR_SLOTS 2 number of directory slots in the Page Directory part; initial value = 2
PAGE_HEAP_TOP 2 record pointer to first record in heap
PAGE_N_HEAP 2 number of heap records; initial value = 2
PAGE_FREE 2 record pointer to first free record
PAGE_GARBAGE 2 "number of bytes in deleted records"
PAGE_LAST_INSERT 2 record pointer to the last inserted record
PAGE_DIRECTION 2 either PAGE_LEFT, PAGE_RIGHT, or PAGE_NO_DIRECTION
PAGE_N_DIRECTION 2 number of consecutive inserts in the same direction, e.g. "last 5 were all to the left"
PAGE_N_RECS 2 number of user records
PAGE_MAX_TRX_ID 8 the highest ID of a transaction which might have changed a record on the page (only set for secondary indexes)
PAGE_LEVEL 2 level within the index (0 for a leaf page)
PAGE_INDEX_ID 8 identifier of the index the page belongs to
PAGE_BTR_SEG_LEAF 10 "file segment header for the leaf pages in a B-tree" (this is irrelevant here)
PAGE_BTR_SEG_TOP 10 "file segment header for the non-leaf pages in a B-tree" (this is irrelevant here)
PAGE_FREE:
被free掉的記錄都存在一個(gè)單向鏈表中,PAGE_FREE指針指向這個(gè)鏈表的第一條記錄。下一條記錄通過記錄的EXTRA BYTES來指示。
PAGE_DIRECTION和PAGE_N_DIRECTION:
用來指示記錄是否以升序的形式插入。
PAGE_HEAP_TOP和PAGE_FREE以及PAGE_LAST_INSERT:
和記錄指針一樣,這些指針也不是指向記錄的開始,而是記錄的原點(diǎn)(見記錄格式)。
PAGE_BTR_SEG_LEAF和PAGE_BTR_SEG_TOP:
這幾個(gè)域保存了索引節(jié)點(diǎn)的文件段信息(space ID, page number, byte offset)。InnoDB使用這些信息來分配一個(gè)新的頁。InnoDB為葉子頁和內(nèi)節(jié)點(diǎn)頁分別分配空間。
Infimum和Supremum記錄
在InnoDB中一個(gè)Infimum就相當(dāng)于達(dá)夢中的最小虛記錄,它比任何可能的實(shí)際值都要小,一個(gè)Supremum記錄相當(dāng)于達(dá)夢中的最大虛記錄,它比任何可能的實(shí)際值都要大。InnoDB在頁創(chuàng)建的時(shí)候?qū)⒆詣?dòng)創(chuàng)建Infimum記錄和Supremum記錄,這兩個(gè)記錄為頁中記錄的遍歷提供了一個(gè)屏障。而且infimum記錄對于臨時(shí)記錄鎖也有用。
User Records
在User Records部分,你可以找到用戶插入的所有記錄。
有兩種辦法可以遍歷用戶記錄,取決于你是要考慮組織順序還是不考慮。
一個(gè)無序的鏈表通常稱為heap,InnoDB插入一條新的記錄不會按照B樹鍵的順序來插入,而是在現(xiàn)在的行的最后插入,或者從刪除的行上分配空間。
但是根據(jù)B樹的定義,記錄的存取應(yīng)該是按照關(guān)鍵字來排序的,因此,每個(gè)記錄都有一個(gè)指針(EXTRA BYTES中的next域)來指向按照關(guān)鍵字排序的下一個(gè)記錄。也就是說,這些記錄是一個(gè)單向鏈表。
Page Directory
Page Directory是指向記錄的指針。有時(shí)候這些記錄指針被稱為slots或directory solts。InnoDB并不為頁中的每個(gè)記錄保留一個(gè)slot,而是使用一個(gè)稀疏目錄,在一個(gè)完整的頁中,每六個(gè)記錄使用一個(gè)slot。
slots記錄了記錄的邏輯順序。如果記錄物理格式為A B F D,那么slots中為A B D F。
但是因?yàn)镻age Directory并不為每個(gè)記錄保留一個(gè)slot,因此,它只能給出一個(gè)大體的位置,然后利用記錄的next指針。
Fil Trailer
Fil Trailer只有一個(gè)部分:
FIL_PAGE_END_LSN 8 low 4 bytes = checksum of page, last 4 bytes = same as FIL_PAGE_LSN
這個(gè)部分是用來保證頁的完整性的。
下面看你個(gè)完整的例子:
這是一個(gè)頁在物理上的存儲,
Address Values in Hexadecimal Values in ASCII
0D4000: 00 00 00 00 00 00 00 35 FF FF FF FF FF FF FF FF .......5........
0D4010: 00 00 00 00 00 00 E2 64 45 BF 00 00 00 00 00 00 .......dE.......
0D4020: 00 00 00 00 00 00 00 05 02 F5 00 12 00 00 00 00 ................
0D4030: 02 E1 00 02 00 0F 00 10 00 00 00 00 00 00 00 00 ................
0D4040: 00 00 00 00 00 00 00 00 00 14 00 00 00 00 00 00 ................
0D4050: 00 02 16 B2 00 00 00 00 00 00 00 02 15 F2 08 01 ................
0D4060: 00 00 03 00 89 69 6E 66 69 6D 75 6D 00 09 05 00 .....infimum....
0D4070: 08 03 00 00 73 75 70 72 65 6D 75 6D 00 22 1D 18 ....supremum."..
0D4080: 13 0C 06 00 00 10 0D 00 B7 00 00 00 00 04 14 00 ................
0D4090: 00 00 00 09 1D 80 00 00 00 2D 00 84 41 41 41 41 .........-..AAAA
0D40A0: 41 41 41 41 41 41 41 41 41 41 41 1F 1B 17 13 0C AAAAAAAAAAA.....
...
...
0D7FE0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 74 ...............t
0D7FF0: 02 47 01 AA 01 0A 00 65 3A E0 AA 71 00 00 E2 64 .G.....e:..q...d
我們?nèi)サ羟懊?8字節(jié)的Fil Header。Page Header開始位置是0d4026,如下所示:
Location Name Description
00 05 PAGE_N_DIR_SLOTS There are 5 directory slots.
02 F5 PAGE_HEAP_TOP At location 0402F5, not shown, is the beginning of free space. Maybe a better name would have been PAGE_HEAP_END.
00 12 PAGE_N_HEAP There are 18 (hexadecimal 12) records in the page.
00 00 PAGE_FREE There are zero free (deleted) records.
00 00 PAGE_GARBAGE There are zero bytes in deleted records.
02 E1 PAGE_LAST_INSERT The last record was inserted at location 02E1, not shown, within the page.
00 02 PAGE_DIRECTION A glance at page0page.h will tell you that 2 is the #defined value for PAGE_RIGHT.
00 0F PAGE_N_DIRECTION The last 15 (hexadecimal 0F) inserts were all done "to the right" because I was inserting in ascending order.
00 10 PAGE_N_RECS There are 16 (hexadecimal 10) user records. Notice that PAGE_N_RECS is smaller than the earlier field, PAGE_N_HEAP.
00 00 00 00 00 00 00 PAGE_MAX_TRX_ID
00 00 PAGE_LEVEL Zero because this is a leaf page.
00 00 00 00 00 00 00 14 PAGE_INDEX_ID This is index number 20.
00 00 00 00 00 00 00 02 16 B2 PAGE_BTR_SEG_LEAF
00 00 00 00 00 00 00 02 15 F2 PAGE_BTR_SEG_TOP |
|