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.mzph.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…