[翻譯] InnoDB 空間文件中的頁面管理

{"type":"doc","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"本系列文章翻譯自 ","attrs":{}},{"type":"link","attrs":{"href":"https://blog.jcole.us/","title":"","type":null},"content":[{"type":"text","text":"Jeremy Cole's Blog","attrs":{}}]},{"type":"text","text":" 中的 ","attrs":{}},{"type":"link","attrs":{"href":"https://blog.jcole.us/innodb/","title":"","type":null},"content":[{"type":"text","text":"InnoDB系列","attrs":{}}]},{"type":"text","text":" 文章 。共 16 篇,本文爲第 4 篇。原文鏈接:","attrs":{}},{"type":"link","attrs":{"href":"https://blog.jcole.us/2013/01/04/page-management-in-innodb-space-files/","title":"","type":null},"content":[{"type":"text","text":"Page management in InnoDB space files","attrs":{}}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"因翻譯水品有限,爲了避免對讀者造成誤解,一些專有名詞的翻譯會在其後用","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"[]","attrs":{}}],"attrs":{}},{"type":"text","text":"標記出原文。","attrs":{}}]}],"attrs":{}},{"type":"heading","attrs":{"align":null,"level":1},"content":[{"type":"text","text":"InnoDB 空間文件中的頁面管理","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在 ","attrs":{}},{"type":"link","attrs":{"href":"https://blog.jcole.us/2013/01/02/on-learning-innodb-a-journey-to-the-core/","title":"","type":null},"content":[{"type":"text","text":"On learning InnoDB: a journey to the core","attrs":{}}]},{"type":"text","text":" (","attrs":{}},{"type":"link","attrs":{"href":"https://xie.infoq.cn/article/f083b52b09d21b92195f5b94e","title":"","type":null},"content":[{"type":"text","text":"譯文","attrs":{}}]},{"type":"text","text":")一文中,我介紹了用來記錄 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"InnoDB","attrs":{}}],"attrs":{}},{"type":"text","text":" 內部結構的 ","attrs":{}},{"type":"link","attrs":{"href":"http://github.com/jeremycole/innodb_diagrams","title":"","type":null},"content":[{"type":"text","text":"innodb_diagrams","attrs":{}}]},{"type":"text","text":" 項目,本文中所使用的圖表均可以在該項目中找到。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"空間的基本結構以及每個頁面的基本結構在 ","attrs":{}},{"type":"link","attrs":{"href":"https://blog.jcole.us/2013/01/03/the-basics-of-innodb-space-file-layout/","title":"","type":null},"content":[{"type":"text","text":"The basics of InnoDB space file layout","attrs":{}}]},{"type":"text","text":" (","attrs":{}},{"type":"link","attrs":{"href":"https://xie.infoq.cn/article/0a67a37694993f5e7a36002f9","title":"","type":null},"content":[{"type":"text","text":"譯文","attrs":{}}]},{"type":"text","text":")一文已經中有所描述,接下來我們將詳細描述 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"InnoDB","attrs":{}}],"attrs":{}},{"type":"text","text":" 中 與 頁面管理、區段管理、空閒空間管理相關的結構,以及它如何跟蹤分配給不同用途的頁面的使用情況。","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"區段和區段描述符","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"正如前面所描述的,","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"InnoDB","attrs":{}}],"attrs":{}},{"type":"text","text":" 頁面通常是 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"16KB","attrs":{}}],"attrs":{}},{"type":"text","text":",並被分組爲 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"1MB","attrs":{}}],"attrs":{}},{"type":"text","text":" 大小的塊,一塊包含","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"64","attrs":{}}],"attrs":{}},{"type":"text","text":"個連續頁面,這被稱爲“區段[","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"extent","attrs":{}}],"attrs":{}},{"type":"text","text":"]”。","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"InnoDB","attrs":{}}],"attrs":{}},{"type":"text","text":" 在空間內的固定位置分配 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"FSP_HDR","attrs":{}}],"attrs":{}},{"type":"text","text":" 和 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"XDES","attrs":{}}],"attrs":{}},{"type":"text","text":" 頁面,用來跟蹤哪些 區段 是正在使用的,以及每個 區段 內哪些頁面是正在使用的。這些頁面的結構非常簡單:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/22/229e878f9abec273ba9be7001673a524.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"它們包含通用的 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"FIL Header","attrs":{}}],"attrs":{}},{"type":"text","text":" 和 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"FIL Trailer","attrs":{}}],"attrs":{}},{"type":"text","text":",一個 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"FSP Header","attrs":{}}],"attrs":{}},{"type":"text","text":"(將在稍後討論),以及 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"256","attrs":{}}],"attrs":{}},{"type":"text","text":" 個“區段描述符[","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"extent descriptors","attrs":{}}],"attrs":{}},{"type":"text","text":"]”,還包含大量未使用的空間。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"區段描述符具有以下結構:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/af/af60e9aff6b6c6c6aabfc3f1b92f5cfa.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"區段描述符中各個字段的用途如下:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"codeinline","content":[{"type":"text","text":"File Segment ID(8)","attrs":{}}],"attrs":{}},{"type":"text","text":",文件段","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"ID","attrs":{}}],"attrs":{}},{"type":"text","text":":如果一個區段屬於文件段的話,這個字段表示該區段所屬文件段的 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"ID","attrs":{}}],"attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"codeinline","content":[{"type":"text","text":"List node for XDES list(12)","attrs":{}}],"attrs":{}},{"type":"text","text":",","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"XDES","attrs":{}}],"attrs":{}},{"type":"text","text":" 鏈表的鏈表節點:在區段描述符鏈表中指向上一個區段和下一個區段的指針","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"codeinline","content":[{"type":"text","text":"State(4)","attrs":{}}],"attrs":{}},{"type":"text","text":",區段當前的的狀態:目前只定義了四個值:","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"FREE","attrs":{}}],"attrs":{}},{"type":"text","text":",","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"FREE_FRAG","attrs":{}}],"attrs":{}},{"type":"text","text":",","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"FULL_FRAG","attrs":{}}],"attrs":{}},{"type":"text","text":"(這三個狀態表示區段屬於 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"FREE","attrs":{}}],"attrs":{}},{"type":"text","text":" 鏈表 / ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"FREE_FRAGE","attrs":{}}],"attrs":{}},{"type":"text","text":" 鏈表 / ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"FULL_FRAGE","attrs":{}}],"attrs":{}},{"type":"text","text":" 鏈表),","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"FSEG","attrs":{}}],"attrs":{}},{"type":"text","text":"(這個狀態表示區段屬於某個文件段,文件段ID 存儲在 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"XDES Entry","attrs":{}}],"attrs":{}},{"type":"text","text":" 結構中的 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"File segment ID","attrs":{}}],"attrs":{}},{"type":"text","text":" 字段中)","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"codeinline","content":[{"type":"text","text":"Page State Bitmap(16)","attrs":{}}],"attrs":{}},{"type":"text","text":",頁面狀態位圖:在該區段中爲每個頁面分配","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"2位","attrs":{}}],"attrs":{}},{"type":"text","text":"的位圖(","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"64","attrs":{}}],"attrs":{}},{"type":"text","text":" x ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"2","attrs":{}}],"attrs":{}},{"type":"text","text":" = ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"128","attrs":{}}],"attrs":{}},{"type":"text","text":"位,","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"16","attrs":{}}],"attrs":{}},{"type":"text","text":"字節)。第一位表示該頁是否爲空閒;第二個位被預留用於指示頁面是否是乾淨[","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"clean","attrs":{}}],"attrs":{}},{"type":"text","text":"]的(乾淨的表示沒有未刷新到磁盤的髒數據),但是這個位當前未使用,該位始終設置爲","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"1","attrs":{}}],"attrs":{}}]}]}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"其他結構如果要引用區段,需要使用 區段描述符所在的 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"FSP_HDR","attrs":{}}],"attrs":{}},{"type":"text","text":" 頁面(或 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"XDES","attrs":{}}],"attrs":{}},{"type":"text","text":" 頁面)的頁號 和 區段描述符條目本身在頁內的字節偏移量 組合來實現。例如,","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"0號頁面 偏移量 150","attrs":{}}],"attrs":{}},{"type":"text","text":"引用的區段是空間中的第一個區段,包含頁面","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"0-63","attrs":{}}],"attrs":{}},{"type":"text","text":",而","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"16384號頁面 偏移量270","attrs":{}}],"attrs":{}},{"type":"text","text":"包含頁面","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"16576-16639","attrs":{}}],"attrs":{}},{"type":"text","text":"。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"譯者注:這裏對第二個例子進行一下詳細的計算,對於","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"16384號頁面 偏移量270","attrs":{}}],"attrs":{}},{"type":"text","text":",首先","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"16384","attrs":{}}],"attrs":{}},{"type":"text","text":"號頁面是第","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"256","attrs":{}}],"attrs":{}},{"type":"text","text":"個區段中的第一個頁面(","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"XDES","attrs":{}}],"attrs":{}},{"type":"text","text":"類型),所以這個頁面中記錄了第","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"256-511","attrs":{}}],"attrs":{}},{"type":"text","text":"區段中的區段描述符,偏移量","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"270","attrs":{}}],"attrs":{}},{"type":"text","text":"指向的是本頁面中第","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"4","attrs":{}}],"attrs":{}},{"type":"text","text":"個","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"XDES","attrs":{}}],"attrs":{}},{"type":"text","text":"條目(","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"38+112+40x3 = 270","attrs":{}}],"attrs":{}},{"type":"text","text":"),所以描述的是第","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"259","attrs":{}}],"attrs":{}},{"type":"text","text":"個區段的信息,也就是","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"16576-16639","attrs":{}}],"attrs":{}},{"type":"text","text":"號頁面。","attrs":{}}]}],"attrs":{}},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"鏈表基節點和鏈表節點","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"鏈表(","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"InnoDB","attrs":{}}],"attrs":{}},{"type":"text","text":" 稱之爲“自由鏈表[","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"free lists","attrs":{}}],"attrs":{}},{"type":"text","text":"]”)是一種非常通用的結構,可以將多個相關結構鏈接在一起。它由“鏈表基節點”和“鏈表節點”兩個互補的結構共同組成了一個很好的磁盤上雙向鏈表。“鏈表基節點”的結構如下:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/96/961ef4d8f787112293f026ca95077886.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"“鏈表基節點” 只在某些高級結構(如 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"FSP Header","attrs":{}}],"attrs":{}},{"type":"text","text":")中存儲一次。它包含 鏈表的長度,以及指向鏈表中第一個和最後一個節點的指針。“鏈表節點”的結構看起來非常相似,只是“鏈表節點”中存儲的不是第一個和最後一個節點的指針,而是前一個和下一個節點的指針:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/f3/f3632e83a92c3e47c09fc64c2b10df9f.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"所有指針都包含一個頁碼(必須在同一空間內)和一個可以找到鏈表節點的頁面中的字節偏移量。所有指針都指向“鏈表節點”結構的起始位置(即 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"N+0","attrs":{}}],"attrs":{}},{"type":"text","text":" ),而並不一定是鏈表節點所屬結構的起始位置。例如,在區段描述符條目鏈表中,由於鏈表節點在 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"XDES","attrs":{}}],"attrs":{}},{"type":"text","text":" 條目結構中的偏移量爲","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"8","attrs":{}}],"attrs":{}},{"type":"text","text":",讀取 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"XDES","attrs":{}}],"attrs":{}},{"type":"text","text":" 條目的代碼必須“知道” ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"XDES","attrs":{}}],"attrs":{}},{"type":"text","text":" 結構開始於列表節點的偏移量之前","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"8","attrs":{}}],"attrs":{}},{"type":"text","text":"個字節,並從那裏開始讀取結構。(確保列表節點在任何結構中都位於最前面可能是一個好主意,但事實並非如此。)","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"文件空間頭和區段列表","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"除了存儲區段描述符條目本身之外,","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"FSP_HDR","attrs":{}}],"attrs":{}},{"type":"text","text":" 頁面(該頁面在空間中始終是","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"0","attrs":{}}],"attrs":{}},{"type":"text","text":"號頁面)還存儲了 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"FSP Header","attrs":{}}],"attrs":{}},{"type":"text","text":" 結構,它包含了大量鏈表,這也是我爲什麼沒有在前面描述該結構的原因。","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"FSP Header","attrs":{}}],"attrs":{}},{"type":"text","text":"的結構如下:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/4a/4a818169c54fd0b606225ddddc264b09.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"codeinline","content":[{"type":"text","text":"FSP Header","attrs":{}}],"attrs":{}},{"type":"text","text":"中與列表無關的字段(不按順序排列):","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"codeinline","content":[{"type":"text","text":"Space ID(4)","attrs":{}}],"attrs":{}},{"type":"text","text":":當前空間的空間 ID","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"codeinline","content":[{"type":"text","text":"Highest page number in the space (size)(4)","attrs":{}}],"attrs":{}},{"type":"text","text":":","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"size","attrs":{}}],"attrs":{}},{"type":"text","text":"表示最高的有效頁碼,並且隨文件增長遞增。但是,並非所有分配了頁碼的頁都被初始化了(有些可能是被零填充的),因爲空間的擴展是一個包含很多步驟的過程","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"codeinline","content":[{"type":"text","text":"Highest page number initialized (free limit)(4)","attrs":{}}],"attrs":{}},{"type":"text","text":",","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"free limit","attrs":{}}],"attrs":{}},{"type":"text","text":"是所有","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"FIL header","attrs":{}}],"attrs":{}},{"type":"text","text":"已經被初始化的所有頁面中的最大頁碼,初始化過程中包含將頁碼存儲在頁面自身中。","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"free limit","attrs":{}}],"attrs":{}},{"type":"text","text":"始終小於或等於","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"size","attrs":{}}],"attrs":{}},{"type":"text","text":"。","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"codeinline","content":[{"type":"text","text":"Flags(4)","attrs":{}}],"attrs":{}},{"type":"text","text":":儲存與空間有關的標記","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"codeinline","content":[{"type":"text","text":"Next Unused Segment ID(8)","attrs":{}}],"attrs":{}},{"type":"text","text":":將被用於下一個分配的文件段的文件段 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"ID","attrs":{}}],"attrs":{}},{"type":"text","text":"。(這是一個自動遞增的整數。)","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"codeinline","content":[{"type":"text","text":"Number of pages used in the FREE_FRAG list","attrs":{}}],"attrs":{}},{"type":"text","text":":存儲這個字段是出於性能優化的考慮,以便能夠快速計算 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"FREE_FRAG","attrs":{}}],"attrs":{}},{"type":"text","text":" 鏈表中所有區段的空閒頁數和,而無需遍歷鏈表中的所有區段並對每個區中可用的空閒頁求和。","attrs":{}}]}]}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"下列區段描述符鏈表的鏈表基節點也存儲在 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"FSP Header","attrs":{}}],"attrs":{}},{"type":"text","text":" 中:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"codeinline","content":[{"type":"text","text":"FREE_FRAG","attrs":{}}],"attrs":{}},{"type":"text","text":"鏈表:該鏈表中的區段均爲 存在空閒的頁面可用於按照\"碎片\"方式分配 的區段,按照“碎片”方式分配的含義是可以根據不同的需要分配單獨的頁面,而不是分配整個區段。例如,每個具有 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"FSP_HDR","attrs":{}}],"attrs":{}},{"type":"text","text":" 頁面或 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"XDES","attrs":{}}],"attrs":{}},{"type":"text","text":" 頁面的 區段 將被放置在 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"FREE_FRAG","attrs":{}}],"attrs":{}},{"type":"text","text":" 列表中,以便 區段 中剩餘的空閒頁面可以分配用於其他用途。","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"codeinline","content":[{"type":"text","text":"FULL_FRAG","attrs":{}}],"attrs":{}},{"type":"text","text":"鏈表:與 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"FREE_FRAG","attrs":{}}],"attrs":{}},{"type":"text","text":" 完全一樣,但是鏈表中保存的是沒有剩餘可用頁面的區段。當 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"FREE_FRAGE","attrs":{}}],"attrs":{}},{"type":"text","text":" 鏈表中的某個區段變滿(所有頁面均已使用)時,區段便會從 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"FREE_FRAG","attrs":{}}],"attrs":{}},{"type":"text","text":" 鏈表 移動到 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"FULL_FRAG","attrs":{}}],"attrs":{}},{"type":"text","text":" 鏈表,如果其中有頁面被釋放,這些區段就會被移回 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"FREE_FRAG","attrs":{}}],"attrs":{}},{"type":"text","text":" 鏈表,因爲它們不再滿了。","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"codeinline","content":[{"type":"text","text":"FREE","attrs":{}}],"attrs":{}},{"type":"text","text":"鏈表:鏈表中的區段均爲完全未使用的區段,且可用於按照整個區段來整體。 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"FREE","attrs":{}}],"attrs":{}},{"type":"text","text":" 區段可以分配給一個文件段(並放置在適當的 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"INODE","attrs":{}}],"attrs":{}},{"type":"text","text":" 列表中),或者移動到 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"FREE_FRAG","attrs":{}}],"attrs":{}},{"type":"text","text":" 鏈表中按照“碎片”方式分配頁面使用。","attrs":{}}]}]}],"attrs":{}},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"文件段和 inodes","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"文件段和 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"inodes","attrs":{}}],"attrs":{}},{"type":"text","text":" 可能是 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"InnoDB","attrs":{}}],"attrs":{}},{"type":"text","text":" 中術語和文檔最模糊的地方。","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"InnoDB","attrs":{}}],"attrs":{}},{"type":"text","text":" 重載了文件系統中常用的術語 ","attrs":{}},{"type":"link","attrs":{"href":"http://en.wikipedia.org/wiki/Inode","title":"","type":null},"content":[{"type":"text","text":"INODE","attrs":{}}]},{"type":"text","text":" ,將其用於 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"INODE","attrs":{}}],"attrs":{}},{"type":"text","text":" 條目(單個小結構)和 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"INODE","attrs":{}}],"attrs":{}},{"type":"text","text":" 頁面(包含許多 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"INODE","attrs":{}}],"attrs":{}},{"type":"text","text":" 條目的頁面)。暫且不考慮命名的混亂,","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"InnoDB","attrs":{}}],"attrs":{}},{"type":"text","text":" 中的一個 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"INODE","attrs":{}}],"attrs":{}},{"type":"text","text":" 條目僅描述一個文件段(通常稱爲 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"FSEG","attrs":{}}],"attrs":{}},{"type":"text","text":"),下文中我們將稱之爲“文件段","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"INODE","attrs":{}}],"attrs":{}},{"type":"text","text":"”。包含這些信息的 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"INODE","attrs":{}}],"attrs":{}},{"type":"text","text":" 頁具有以下結構:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/1b/1ba16fa7341c4a05c887ef70710b9a91.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"每個 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"INODE","attrs":{}}],"attrs":{}},{"type":"text","text":" 頁包含","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"85","attrs":{}}],"attrs":{}},{"type":"text","text":"個 文件段","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"INODE","attrs":{}}],"attrs":{}},{"type":"text","text":" 條目(對於","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"16KB","attrs":{}}],"attrs":{}},{"type":"text","text":"大小的頁),每個條目都是","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"192","attrs":{}}],"attrs":{}},{"type":"text","text":"個字節。此外,每個","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"INODE","attrs":{}}],"attrs":{}},{"type":"text","text":"頁還包含一個鏈表節點,該節點可用於組成下面兩個 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"INODE","attrs":{}}],"attrs":{}},{"type":"text","text":" 頁面鏈表:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"codeinline","content":[{"type":"text","text":"FREE_INODES","attrs":{}}],"attrs":{}},{"type":"text","text":":至少有一個空閒 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"INODE","attrs":{}}],"attrs":{}},{"type":"text","text":" 條目 的 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"INODE","attrs":{}}],"attrs":{}},{"type":"text","text":" 頁面 組成的鏈表。","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"codeinline","content":[{"type":"text","text":"FULL_INODES","attrs":{}}],"attrs":{}},{"type":"text","text":":沒有空閒 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"INODE","attrs":{}}],"attrs":{}},{"type":"text","text":" 條目 的 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"INODE","attrs":{}}],"attrs":{}},{"type":"text","text":" 頁面 組成的鏈表。當使用“","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"file per table","attrs":{}}],"attrs":{}},{"type":"text","text":"”類型表空間時,每個表空間中的這個列表將是空的,除非表有超過 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"42","attrs":{}}],"attrs":{}},{"type":"text","text":" 個索引,因爲每個索引正好消耗兩個文件段 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"INODE","attrs":{}}],"attrs":{}},{"type":"text","text":" 條目。","attrs":{}}]}]}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"codeinline","content":[{"type":"text","text":"INODE","attrs":{}}],"attrs":{}},{"type":"text","text":"頁面鏈表的基節點存儲在上文提到的","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"FSP_HDR","attrs":{}}],"attrs":{}},{"type":"text","text":" 頁面的 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"FSP Header","attrs":{}}],"attrs":{}},{"type":"text","text":" 結構中。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"一個文件段 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"INODE","attrs":{}}],"attrs":{}},{"type":"text","text":" 條目具有以下結構:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/2e/2ecde9122ec0a75f6593a5e0e2f0447a.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"文件段 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"INODE","attrs":{}}],"attrs":{}},{"type":"text","text":" 條目 中非列表字段的用途如下:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"codeinline","content":[{"type":"text","text":"File Segment ID","attrs":{}}],"attrs":{}},{"type":"text","text":",文件段 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"ID","attrs":{}}],"attrs":{}},{"type":"text","text":":該 文件段 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"INODE","attrs":{}}],"attrs":{}},{"type":"text","text":" 條目 描述的文件段(","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"FSEG","attrs":{}}],"attrs":{}},{"type":"text","text":")的 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"ID","attrs":{}}],"attrs":{}},{"type":"text","text":" 。如果 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"ID","attrs":{}}],"attrs":{}},{"type":"text","text":" 爲 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"0","attrs":{}}],"attrs":{}},{"type":"text","text":",則表明該條目未使用。","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"codeinline","content":[{"type":"text","text":"Magic Number","attrs":{}}],"attrs":{}},{"type":"text","text":",魔數: 固定存儲 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"97937874","attrs":{}}],"attrs":{}},{"type":"text","text":"作爲該 文件段","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"INODE","attrs":{}}],"attrs":{}},{"type":"text","text":"條目 已正確初始化的標記。","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"codeinline","content":[{"type":"text","text":"Number of used pages in \"NOT_FULL\" list","attrs":{}}],"attrs":{}},{"type":"text","text":",","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"NOT_FULL","attrs":{}}],"attrs":{}},{"type":"text","text":" 鏈表中已經使用的頁面數:與空間的 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"FREE_FRAG","attrs":{}}],"attrs":{}},{"type":"text","text":" 鏈表(保存在","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"FSP Header","attrs":{}}],"attrs":{}},{"type":"text","text":"中)類似,該字段存儲的是 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"NOT_FULL","attrs":{}}],"attrs":{}},{"type":"text","text":" 鏈表中已使用的頁面數,以便能夠快速計算出鏈表中的空閒頁面數而不需要遍歷鏈表中的所有區段並求和。","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"codeinline","content":[{"type":"text","text":"Fragement Array","attrs":{}}],"attrs":{}},{"type":"text","text":",碎片頁面數組:來自空間的 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"FREE_FRAG","attrs":{}}],"attrs":{}},{"type":"text","text":" 鏈表或 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"FULL_FRAG","attrs":{}}],"attrs":{}},{"type":"text","text":" 鏈表 中的“碎片”區段中的","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"32","attrs":{}}],"attrs":{}},{"type":"text","text":"個單獨分配的頁面的頁碼數組。一旦這個數組變滿,就只能將完整的區段分配給文件段。","attrs":{}}]}]}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"隨着表的增長,","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"InnoDB","attrs":{}}],"attrs":{}},{"type":"text","text":" 首先爲每個文件段中分配單獨的頁面,直到文件段中的碎片頁面數組變滿,然後改爲一次分配 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"1","attrs":{}}],"attrs":{}},{"type":"text","text":" 個區段,最終一次分配 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"4","attrs":{}}],"attrs":{}},{"type":"text","text":" 個區段。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"每個 文件段","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"INODE","attrs":{}}],"attrs":{}},{"type":"text","text":"條目 中同樣包含區段描述符鏈表的基節點:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"codeinline","content":[{"type":"text","text":"FREE","attrs":{}}],"attrs":{}},{"type":"text","text":"鏈表:包含分配給此文件段且完全空閒的區段。","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"codeinline","content":[{"type":"text","text":"NOT_FULL","attrs":{}}],"attrs":{}},{"type":"text","text":"鏈表:包含分配給此文件段且至少有一個已用頁面的區段。當最後一個空閒頁被使用,該區段將移動到","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"FULL","attrs":{}}],"attrs":{}},{"type":"text","text":"鏈表中。","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"codeinline","content":[{"type":"text","text":"FULL","attrs":{}}],"attrs":{}},{"type":"text","text":"鏈表:包含分配給此文件段的已經沒有空閒頁的區段。如果其中某個區段中有頁面變爲空閒,則該區段將移動到","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"NOT_FULL","attrs":{}}],"attrs":{}},{"type":"text","text":"列表中。","attrs":{}}]}]}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"如果","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"NOT_FULL","attrs":{}}],"attrs":{}},{"type":"text","text":"鏈表的某個區段中的最後一個使用的頁面被釋放,其實該區段可以移動到文件段的","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"FREE","attrs":{}}],"attrs":{}},{"type":"text","text":"鏈表,但實際上該區段會直接被移回空間的","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"FREE","attrs":{}}],"attrs":{}},{"type":"text","text":"鏈表。","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"索引如何使用文件段","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"雖然我們還沒有介紹 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"INDEX","attrs":{}}],"attrs":{}},{"type":"text","text":" 頁面,但現在可以看看其中一個小方面。每個索引的根頁面中包含指向 文件段 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"INODE","attrs":{}}],"attrs":{}},{"type":"text","text":" 條目 的指針,這些條目描述了索引使用的文件段。每個索引的 葉子 頁面 使用一個文件段,非葉葉子(內部)頁面使用一個文件段。這些信息存儲在 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"FSEG Header","attrs":{}}],"attrs":{}},{"type":"text","text":" 結構中(這是","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"INDEX","attrs":{}}],"attrs":{}},{"type":"text","text":" 頁面中的一個結構):","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/21/21a21e3e3558b2c9594641c65975e69d.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"其中存儲的","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"Space ID","attrs":{}}],"attrs":{}},{"type":"text","text":"有點多餘———它們將始終與當前空間相同。 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"Page Number","attrs":{}}],"attrs":{}},{"type":"text","text":" 和 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"Offset","attrs":{}}],"attrs":{}},{"type":"text","text":" 指向","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"INODE","attrs":{}}],"attrs":{}},{"type":"text","text":"頁面中的 文件段 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"INODE","attrs":{}}],"attrs":{}},{"type":"text","text":" 條目。這兩個文件段將始終存在,即使它們可能完全爲空。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"例如,在新創建的表中,唯一存在的頁只有根頁面,它也是一個葉子節點頁面,但存在於“內部[","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"internal","attrs":{}}],"attrs":{}},{"type":"text","text":"]”文件段中(這樣新增數據時就可以不必再移動它)。“葉[","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"leaf","attrs":{}}],"attrs":{}},{"type":"text","text":"]”文件段的 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"INODE","attrs":{}}],"attrs":{}},{"type":"text","text":"鏈表 和 碎片頁面數組 都爲空。“內部”文件段的 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"INODE","attrs":{}}],"attrs":{}},{"type":"text","text":" 鏈表也爲空,唯一已經分配的根頁面存在於碎片頁面數組中。","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"把這一切聯繫在一起","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"下面這張圖將索引的整個多級結構聯繫在了一起:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/07/070044a49547a0430daec2b6b8414051.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"索引根頁面指向兩個文件段,每個文件段都有一個碎片頁面數組(指向碎片頁面鏈表中的單獨的頁面,最多 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"32","attrs":{}}],"attrs":{}},{"type":"text","text":" 個),以及幾個完整區段的鏈表,這些鏈表通過區段描述符中的鏈表節點指針鏈接在一起。區段描述符用於引用區段以及跟蹤區段內的空閒頁。很簡單!","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"下一步是什麼","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"接下來,我們將從用戶的角度來看看","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"InnoDB","attrs":{}}],"attrs":{}},{"type":"text","text":"中最重要的頁面類型之一,","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"INDEX","attrs":{}}],"attrs":{}},{"type":"text","text":" 頁面的結構。然後我們將看看 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"InnoDB","attrs":{}}],"attrs":{}},{"type":"text","text":" 如何在宏觀上構建索引。","attrs":{}}]}]}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章