InnoDB文件物理結構解析6 - FIL_PAGE_INDEX

本文討論Secondary Key Page的解析,也就是表非主鍵索引的記錄存儲。與Clustered Key Page有相同的基本記錄結構,也細分為Leaf Page和Non-Leaf Page,我們先看結構:

### Contents (Secondary Key - Leaf Page) ###
------------------------+------------------------+
Secondary Key Fields (k)| Cluster Key Fields (j) |
------------------------+------------------------+### Contents (Secondary Key - Non-Leaf Page) ###
-----------------------------------------+----------------------------------------+-----------------------+
Secondary Key Min. Key on Child Page (k) | Cluster Key Min. Key on Child Page (j) | Child Page Number (4) |
-----------------------------------------+----------------------------------------+-----------------------+

先看Leaf Page, 記錄的基本結構都是一樣的,有Extra Bytes, null-bitmap, variable-field-lengths部分,但是內容不同。InnoDB中,非主鍵索引(組合索引)字段是允許包含空值的。null-bitmap用于標記Secondary Key Fields中的空值。variable-field-lengths包含Secondary和Cluster Key的可變長字段的記錄存儲的長度。

記錄內容中,最前面部分存放索引的字段,后面接著索引字段值對應的主鍵值,記錄內容不包含DB_TRX_ID和DB_ROLL_PTR偽字段。以sakila.film表的idx_title(index_id = 597)索引為例,根據《InnoDB文件物理結構解析2》的IdxPage1案例的輸出,idx_title索引的相關頁為:

 PAGE       PAGE_TYPE LEVEL INDEX_ID   PAGE_PREV   PAGE_NEXT
----- --------------- ----- -------- ----------- -----------5     FIL_PAGE_INDEX     1      597  4294967295  4294967295 
16     FIL_PAGE_INDEX     0      597  4294967295          17 
17     FIL_PAGE_INDEX     0      597          16  4294967295 

所以,page(5)是Secondary Key Non-Leaf Page,page(16)和page(17)為Secondary Key Leaf Page,我們寫個案例分析page(16)的內容:

public class IdxPage6 {public static void main(String[] args) throws Exception {String fileName = "D:\\Data\\mysql\\8.0.18\\data\\sakila\\film.ibd";try (IbdFileParser parser = new IbdFileParser(fileName)) {IndexPage page = (IndexPage) parser.getPage(16);long indexId = page.getIndexHeader().getIndexId().longValueExact();TableMeta tableMeta = IdxPage3.getFilmTableMeta(); 定義索引的元數據(索引包含哪些列)tableMeta.setSecondaryKey(indexId, 1, "title");SecondaryKeyLeafPage leafPage = new SecondaryKeyLeafPage(page.getPageRaw(), page.getPageSize());List<SecondaryKeyLeafRecord> records = leafPage.getUserRecords(tableMeta);StringBuilder buff = new StringBuilder();buff.append("Secondary Key Fields             Cluster Key Fields      \n").append("-------------------------------- ------------------------\n");for (SecondaryKeyLeafRecord record : records) {List<RecordField> skFields = record.getSecondaryKeyFields();List<RecordField> ckFields = record.getClusterKeyFields();StringBuilder skValue = new StringBuilder();StringBuilder ckValue = new StringBuilder();for(RecordField field: skFields) {skValue.append(field.getName()).append(" = ").append(field.getContent()).append(" ");}buff.append(String.format("%-32s ", skValue));for(RecordField field: ckFields) {ckValue.append(field.getName()).append(" = ").append(field.getContent()).append(" ");}buff.append(String.format("%-24s\n", ckValue));}System.out.println(buff);}}
}
/*
程序輸出:
Secondary Key Fields             Cluster Key Fields      
-------------------------------- ------------------------
title = ACADEMY DINOSAUR         film_id = 1             
title = ACE GOLDFINGER           film_id = 2             
title = ADAPTATION HOLES         film_id = 3             
title = AFFAIR PREJUDICE         film_id = 4             
title = AFRICAN EGG              film_id = 5             
title = AGENT TRUMAN             film_id = 6             
title = AIRPLANE SIERRA          film_id = 7             
title = AIRPORT POLLOCK          film_id = 8             
title = ALABAMA DEVIL            film_id = 9             
title = ALADDIN CALENDAR         film_id = 10            
title = ALAMO VIDEOTAPE          film_id = 11  
...      
*/

由輸出可以看到,InnoDB索引,記錄的是索引值對應的主鍵值,而不是行記錄的地址,這與Oracle數據庫的索引是不同的,或許與InnoDB是索引組織表有關,行記錄存儲在主鍵中。找條輸出驗證一下解析結果:

root@localhost [sakila]> select title from film where film_id=10;
+------------------+
| title            |
+------------------+
| ALADDIN CALENDAR | // film_id =10 <--> title = ALADDIN CALENDAR與預期的一樣;
+------------------+
1 row in set (0.00 sec)

我們接下來通過案例解析page(5), Non-Leaf頁:

public class IdxPage7 {public static void main(String[] args) throws Exception {String fileName = "D:\\Data\\mysql\\8.0.18\\data\\sakila\\film.ibd";try (IbdFileParser parser = new IbdFileParser(fileName)) {IndexPage page = (IndexPage) parser.getPage(5);long indexId = page.getIndexHeader().getIndexId().longValueExact();TableMeta tableMeta = IdxPage3.getFilmTableMeta(); 定義索引的元數據(索引包含哪些列)tableMeta.setSecondaryKey(indexId, 1, "title");SecondaryKeyNonLeafPage rootPage = new SecondaryKeyNonLeafPage(page.getPageRaw(), page.getPageSize());List<SecondaryKeyNonLeafRecord> records = rootPage.getUserRecords(tableMeta);StringBuilder buff = new StringBuilder();buff.append("Secondary Key Min. Key on Child Page Cluster Key Min. Key on Child Page  Child Page Number \n").append("------------------------------------ ----------------------------------- ------------------\n");for(SecondaryKeyNonLeafRecord record : records) {List<RecordField> minSkFields = record.getMinSecondaryKeyOnChild();List<RecordField> minCkFields = record.getMinClusterKeyOnChild();long childPageNo = record.getChildPageNumber();StringBuilder skValue = new StringBuilder();StringBuilder ckValue = new StringBuilder();for(RecordField field: minSkFields) {skValue.append(field.getName()).append(" = ").append(field.getContent()).append(" ");}buff.append(String.format("%-36s ", skValue));for(RecordField field: minCkFields) {ckValue.append(field.getName()).append(" = ").append(field.getContent()).append(" ");}buff.append(String.format("%-35s ", ckValue));buff.append(String.format("%-15d\n", childPageNo));}System.out.println(buff);}}
}
/*
程序輸出:
Secondary Key Min. Key on Child Page Cluster Key Min. Key on Child Page  Child Page Number 
------------------------------------ ----------------------------------- ------------------
title = ACADEMY DINOSAUR             film_id = 1                         16             
title = GILMORE BOILED               film_id = 358                       17             
*/

索引深度level>0時,根據非葉子節點內的值范圍找葉子節點,再根據所在葉節點中找到對應的主鍵值,然后根據主鍵"回表",找到對應行記錄。

到這里,FIL_PAGE_INDEX的解析介紹完成,下文將介紹一下8.0新引入的FIL_PAGE_SDI。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/36832.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/36832.shtml
英文地址,請注明出處:http://en.pswp.cn/news/36832.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

從小白到大神之路之學習運維第79天-------Kubernetes網絡組件詳解

第四階段 時 間&#xff1a;2023年8月14日 參加人&#xff1a;全班人員 內 容&#xff1a; Kubernetes網絡組件詳解 目錄 一、Kubernetes網絡組件 &#xff08;一&#xff09;Flannel網絡組件 &#xff08;二&#xff09;Calico 網絡插件 &#xff08;1&#xff09;…

設計模式——建造者(Builder)模式

建造者模式&#xff08;Builder Pattern&#xff09;&#xff0c;又叫生成器模式&#xff0c;是一種對象構建模式 它可以將復雜對象的建造過程抽象出來&#xff0c;使這個抽象過程的不同實現方法可以構造出不同表現的對象。建造者模式是一步一步創建一個復雜的對象&#xff0c;…

(14)嵌套列表,Xpath路徑表達式,XML增刪查改,Implicit,Operator,Xml序列化,淺拷貝與深拷貝

一、作業問題 1、問&#xff1a;listbox1.items[i]返回的object是指的字符串嗎&#xff1f; 答&#xff1a;items是真正的對象集合&#xff0c;在Add時加的是Person對象p&#xff0c;則里面的item就是Person對象p。 但是&#xff0c;在listbox1顯…

在單元測試中使用Jest模擬VS Code extension API

對VS Code extension進行單元測試時通常會遇到一個問題&#xff0c;代碼中所使用的VS Code編輯器的功能都依賴于vscode庫&#xff0c;但是我們在單元測試中并沒有添加對vscode庫的依賴&#xff0c;所以導致運行單元測試時出錯。由于vscode庫是作為第三方依賴被引入到我們的VS C…

[oneAPI] BERT

[oneAPI] BERT BERT訓練過程Masked Language Model&#xff08;MLM&#xff09;Next Sentence Prediction&#xff08;NSP&#xff09;微調 總結基于oneAPI代碼 比賽&#xff1a;https://marketing.csdn.net/p/f3e44fbfe46c465f4d9d6c23e38e0517 Intel DevCloud for oneAPI&…

JVM 中的編譯器

在Java的世界里,JVM(Java Virtual Machine)扮演了重要的角色。JVM是一個虛擬機,是Java程序的運行環境,它能夠將Java字節碼文件解釋執行,使得Java程序可以跨平臺。在JVM內部,有一個重要的組件就是編譯器,它的作用就是將Java源代碼編譯成字節碼,讓JVM可以識別并執行。 …

redis集群和分片-Redis Cluster:分布式環境中的數據分片、主從復制和 Sentinel 哨兵

當涉及到 Redis 中的集群、分片、主從復制和 Sentinel 哨兵時&#xff0c;這些是構建分布式 Redis 環境中非常重要的概念和組件。下面詳細介紹這些概念以及它們在分布式環境中的作用。 Redis Cluster Redis Cluster 是 Redis 官方提供的分布式解決方案&#xff0c;用于管理和…

React源碼解析18(4)------ completeWork的工作流程【mount】

摘要 經過上一章&#xff0c;我們得到的FilberNode已經具有了child和return屬性。一顆Filber樹的結構已經展現出來了。 那我們最終是想在頁面渲染真實的DOM。所以我們現在要在completeWork里&#xff0c;構建出一顆離屏的DOM樹。 之前在說FilberNode的屬性時&#xff0c;我們…

zabbix案例--zabbix監控Tomcat

目錄 一、 部署tomcat 二、配置zabbix-java-gateway 三、配置zabbix-server 四、配置zabbix-web界面 一、 部署tomcat tar xf apache-tomcat-8.5.16.tar.gz -C /usr/local/ ln -sv /usr/local/apache-tomcat-8.5.16/ /usr/local/tomcat cd /usr/local/tomcat/bin開啟JMX…

Vscode 常用操作教程

一、語言換成中文 這是我們可以直接點擊左邊欄第四個圖標搜索插件 chinese ,也可以直接ctrlshiftp快捷鍵也會出來如圖所示圖標&#xff0c;出來chinese 插件之后選擇安裝install,安裝完成之后重新ctrlshiftp會出現如圖所示頁面 找到我的鼠標在的地方對應的中文&#xff0c;此時…

win10下如何安裝ffmpeg

安裝ffmpeg之前先安裝win10 綠色軟件管理軟件&#xff1a;scoop. Scoop的基本介紹 Scoop是一款適用于Windows平臺的命令行軟件&#xff08;包&#xff09;管理工具&#xff0c;這里是Github介紹頁。簡單來說&#xff0c;就是可以通過命令行工具&#xff08;PowerShell、CMD等…

VVIC-商品詳情

一、接口參數說明&#xff1a; item_get-根據ID取商品詳情&#xff0c;點擊更多API調試&#xff0c;請移步注冊API賬號點擊獲取測試key和secret 公共參數 請求地址: https://api-gw.onebound.cn/vvic/item_get 名稱類型必須描述keyString是調用key&#xff08;點擊獲取測試k…

第一百一十三回 dart中的getter/setter方法

文章目錄 概念介紹使用方法示例代碼使用擴展 我們在上一章回中介紹了 flutter_screenutil包相關的內容&#xff0c;本章回中將介紹 dart中的setter/getter方法.閑話休提&#xff0c;讓我們一起Talk Flutter吧。 概念介紹 我們在這里介紹的setter/getter方法屬于編程語言中的…

【MongoDB】索引

目錄 一、概述 二、索引的類型 1、單字段索引 2、復合索引 3、其他索引 三、索引的管理 1、索引的創建 2、索引的查看 3、索引的刪除 四、索引的使用 1、執行計劃 2、涵蓋的查詢 一、概述 索引支持在MongoDB中高效地執行查詢。如果沒有索引&#xff0c;MongoDB必須…

Kubernetes pod調度約束[親和性 污點] 生命階段 排障手段

調度約束 Kubernetes 是通過 List-Watch 的機制進行每個組件的協作&#xff0c;保持數據同步的&#xff0c;每個組件之間的設計實現了解耦。 用戶是通過 kubectl 根據配置文件&#xff0c;向 APIServer 發送命令&#xff0c;在 Node 節點上面建立 Pod 和 Container。 APIServer…

springcloud3 hystrix實現服務降級,熔斷,限流以及案例配置

一 hystrix的作用 1.1 降級&#xff0c;熔斷&#xff0c;限流 1.服務降級&#xff1a; A方案出現問題&#xff0c;切換到兜底方案B&#xff1b; 2.服務熔斷&#xff1a;觸發規則&#xff0c;出現斷電限閘&#xff0c;服務降級 3.服務限流&#xff1a;限制請求數量。 二 案例…

ES6學習-Symbol

Symbol 數據類型Symbol&#xff0c;表示獨一無二的值。 對象的屬性名可有兩種類型&#xff0c;一種是原來的字符串&#xff0c;另一種是新增的 Symbol 類型 可以保證不與其他屬性名產生沖突。 let s1 Symbol() let s2 Symbol() console.log(s1, s2, s1 s2)//Symbol() Sy…

liunx exercise

云計算作業 Linux DAY1 1、創建alan1用戶&#xff0c;并使用root用戶切換用戶至alan1用戶。&#xff08;兩種方式切換【加-與不加-】&#xff0c;并總結其效果&#xff09; [rootlocalhost ~]# useradd alan1 [rootlocalhost ~]# su alan1 [alan1localhost root]$ pwd /roo…

FPGA學習——驅動WS2812光源并進行動態顯示

文章目錄 一、WS2812手冊分析1.1 WS2812燈源特性及概述1.2 手冊重點內容分析1.2.1 產品概述1.2.2 碼型及24bit數據設計 二、系統設計2.1 模塊設計2.2 模塊分析2.2.1 驅動模塊2.2.1 數據控制模塊 三、IP核設置及項目源碼3.1 MIF文件設計3.2 ROM IP核調用3.3 FIFO IP核調用3.4 項…

源碼斷點分析Spring的占位符(Placeholder)是怎么工作的

項目中經常需要使用到占位符來滿足多環境不同配置信息的需求&#xff0c;比如&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <beans xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xmlns"http://www.springframe…