Innodb-ruby深入探索Innodb存储结构

达在之前已经分享过Innodb数据存储结构知识,但是都是基于理论原理知识理解,今天利用Innodb文件解析工具ruby进行探索Innodb真实的存储结构。

索引原理过程:【Mysql】 InnoDB引擎深入 - 数据页 | 聚集索引_innodb的聚集索引的数据插入_Survivor001的博客-CSDN博客

Innodb_ruby工具的安装过程也分享过,这里就不阐述了,具体的使用方法,可以查看官网git上面的介绍:Home · jeremycole/innodb_ruby Wiki · GitHub

1、场景描述

这里我创建了简单的一些表:project用来验证不同的理论原理知识:

project 表约2.3w笔数据:

主键索引:project_id

唯一索引:index(`tenantsid`, `code`)

简单说下innodb_space语法:

innodb_space从命令行使用的基础知识。有两种方法可以开始innodb_space

针对单个空间文件(ibdata 或 .ibd):

选项参数描述
-F<文件名>加载表空间文件(系统或表)

针对将自动加载每个表文件的表空间文件的系统表空间:

选项参数描述
-s<文件名>加载系统表空间文件(例如ibdata1)
-T<表名>使用给定的表名称。
-I<索引名称>使用给定的索引名称

注:使用innodb_space查看空间数据需要进入到mysql数据存储目录,我的目录:

/usr/local/mysql/data

2、通过Innodb_space查看系统表空间信息

innodb_space -s ibdata1 system-spaces;

pages:总数据页数量,这里project表,一共使用到了704个 page页

indexes:总索引个数,project表我这里就是聚簇索引和唯一索引,分别就是PRIMARY主键,index(`tenantsid`, `code`)索引。

3、指定表查看索引空间信息 

innodb_space -s ibdata1 -T firestation/project space-indexes;

 id :索引ID,相同的ID表示是同一个索引

root:当前索引的根page页编号 ,可以看出来

fseg:类型,page的说明

used:索引使用到了多少page页,比如PRIMARY的叶子类型中为95,表明使用到了95个page页来存储数据(因为聚簇索引叶子节点存储了数据信息)

allocated:分配了多少page

fill_factor:page使用占比 :used / allocated

这里表示:

PRIMARY 索引树使用使用了1个root节点,该节点根page编号为3,leaf节点数据为95个page,实际分配了96个数据页。这里可以看出来,PRIMARY索引树是一个2层的多叉树结构:

二级索引 index:1个root节点,page编号为7,leaf节点为42个page,实际分配了96个page,也是一个2层多叉树

1、查看节点page空间信息

  已经知道了大致的索引结构了,现在可以详细查看一下指定page页信息

(1)查看主键PRIMARY root页面空间信息

innodb_space -s ibdata1 -T firestation/project -p 3 page-records

 这里可以看到在查看了page为3(PRIMARY索引的root页)的页信息后,一共出来95个page信息,对应了上述表述的95个leaf page,同时默认按照主键ID从小到大排序。

之前理论知识也说过了,目录页会记录最小索引列编号,来作为目录检索,比如查询34000,那就是在33819~34232区间,指向page 6 号数据页里面,这个时候就会去6号page页检索。

所以理论上来说,page5 页中应该是存储了33649~33818之间的数据,下面来验证下

2、查看指定leaf-page空间信息

innodb_space -s ibdata1 -T firestation/project -p 5 page-records

这个打印出来内容比较多,因为所有数据都被展示了,这里我截取下前后id的信息:

这里可以看到首个数据是33649 , 结尾数据是33818,同时也发现了PRIMARY索引的leaf节点里面是有真实数据信息的。但是非叶子节点只有索引列信息,也就是主键ID。

(2)同样操作查看二级索引index空间信息

可以看出来二级索引page数量明显少于聚簇索引page,因为二级索引是不存储其他业务数据字段信息的,所以每个page能存储更多的索引列信息。

同时可以发现联合索引,在non-leaf节点中存储了联合索引列,tenantsid 和 code两个字段信息,且优先索引列顺序,同时优先对tenantsid进行排序,然后对code进行排序。这也正对了前面说到的最左原则特性。

然后看看,leaf节点信息:

可以看出来在二级索引的leaf节点中,是没有完整的数据信息的,处理索引列数据,还存储了主键id信息。这也验证了前面说到的,二级索引查询完成后会通过主键ID查询聚簇索引树。

到这里基本上已经完全了解了Innodb索引数据存储原理了

有个问题?

为什么前面查看系统空间发现project总共使用了704个page,但是通过index空间查看使用到的page数量远小于这个数。

查看系统page使用和分布:

可以看出来,处理真实使用到索引数之外,还会有其他page存储数据,比如缓存、元空间信息等等,后续再详细分享。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/199579.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2952. 需要添加的硬币的最小数量(结论题)

力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 分析知&#xff1a;设指针值从1开始依次递增&#xff0c;每次将coins里的值累加起来看能否得到或者大于当前指针值 &#xff0c;否则就将该指针值累加起来&#xff0c;即需要添加的数 class Solution …

老师需要具备的能力

作为一名老师&#xff0c;需要具备许多能力&#xff0c;来有效地教授学生知识和技能。本文将从以下几个方面探讨老师所需具备的能力。 一、教学能力 教学是老师工作的核心&#xff0c;因此老师需要具备高超的教学能力。这包括了开展教学计划、教学设计、授课技巧和引导学生思考…

bootstrap中的图标元素可以免费使用

Available glyphsIncludes over 250 glyphs in font format from the Glyphicon Halflings set. Glyphicon 网址如下&#xff1a; Components Bootstrap

2024年天津财经大学珠江学院专升本专业课考试《经济学》考试大纲

天津财经大学珠江学院2024年高职升本科专业课考试《经济学》考试大纲 一、本大纲系天津财经大学珠江学院2024年高职升本科《经济学》课程考试大纲。所列考试范围出自郑健壮、王培才主编的教材《经济学基础&#xff08;第二版&#xff09;》&#xff0c;清华大学出版社&#xf…

线程控制.

线程已经成为调度的基本单位了&#xff0c;每一个线程都属于同一个地址空间中&#xff0c;所有的线程都属于同一个进程 换句话任何一个线程尝试调用geipid它应该是同一个pid 可是OS选择线程时&#xff0c;他怎么知道哪个线程是主线程&#xff1f;哪个是新线程&#xff1f;线程也…

C语言-字符串变量

字符串变量 char* s “Hello, world!”&#xff1b; s是一个指针&#xff0c;初始化为指向一个字符串常量 由于这个常量所在的地方&#xff0c;所以实际上s是const char* s&#xff0c;但是由于历史的原因&#xff0c;编译器接受不带const的写法但是试图对s所指的字符串做写…

CAD画图-模型和布局区别,视图命令MV使用(用于局部放大显示)

模型和布局的图像区别 模型的图像&#xff1a; 是我们常编辑的cad文件&#xff0c;我们可以对里面内容进行编辑和测量等操作 布局的图像&#xff1a;为了可以更好的看到每个部件的相对位置&#xff0c;但对于里面的点位的标注就不行了&#xff0c;但可以对图像中的某些部位进行…

软件项目功能测试框架

测试用例的编写需要按照一定的思路进行&#xff0c;而不是想到哪写到哪&#xff0c;一般测试机制成熟的公司都会有公司自己自定义的测试用例模板&#xff0c;以及一整套的测试流程关注点&#xff0c;当然我们自己在测试生涯中也应当积累一套自己的测试框架&#xff0c;所有功能…

二极管:TVS瞬态抑制二极管

一、什么是TVS二极管 TVS&#xff08;Transient Voltage Suppressors&#xff09;&#xff0c;即瞬态电压抑制器&#xff0c;又称雪崩击穿二极管。 TVS二极管的符号如下图所示 什么是雪崩击穿 雪崩击穿是有必要了解一下的&#xff0c;不然后面还有齐纳击穿&#xff0c;搞不…

第二十一章 网络通信

21.1 网络程序设计基础 网络程序设计编写的是与其他计算机进行通信的程序。 局域网与互联网 服务器是指提供信息的计算机或程序&#xff0c;客户机是指请求信息的计算机或程序。网络用于连接服务器与客户机&#xff0c;实现两者间的相互通信。 网络协议 网络协议规定了计算…

P4715 【深基16.例1】淘汰赛-仅思路

首先从题干要求入手&#xff0c;我们可以了解到题目要求是二进一&#xff0c;不难想到这是二叉树的题 再来&#xff0c;从题干可以知道&#xff0c;我们所采用的结构体除了需要有树的两个左右节点指针外&#xff0c;还需要两个变量用来储存“能力值”和“编号” 在这道题中&am…

竞赛选题 题目:基于深度学习的图像风格迁移 - [ 卷积神经网络 机器视觉 ]

文章目录 0 简介1 VGG网络2 风格迁移3 内容损失4 风格损失5 主代码实现6 迁移模型实现7 效果展示8 最后 0 简介 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于深度学习卷积神经网络的花卉识别 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c…

CoreDNS实战(三)-CoreDNS+ETCD实现DNS负载均衡

1 概述 DNS负载均衡简单来说就是通过一个域名绑定多个IP地址&#xff0c;当客户端访问域名时&#xff0c;DNS服务器将轮询返回其中一个IP&#xff0c;实现客户端分流的作用。 在K8s环境中CoreDNS作为容器服务的DNS服务器&#xff0c;那么就可以通过CoreDNS来实现DNS负载均衡&a…

【Linux】基础IO--重定向理解Linux下一切皆文件缓冲区

文章目录 一、重定向1.什么是重定向2.dup2 系统调用3.理解输入重定向、输出重定向和追加重定向4.简易shell完整实现 二、理解linux下一切皆文件三、缓冲区1.为什么要有缓冲区2.缓冲区的刷新策略3.缓冲区的位置4.实现一个简易的C语言缓冲区5.内核缓冲区 一、重定向 1.什么是重定…

Java---类的继承

文章目录 1. 理解继承2. 继承概述3. 代码块理解4. 继承的好处与弊端5. 继承中变量的访问特点6. super关键字7. 继承中构造方法访问特点8. 继承中成员方法访问特点9. 方法重写10. 方法重写注意事项11. Java继承注意事项 1. 理解继承 2. 继承概述 1. 继承是面向对象的三大特征之一…

客观题测试-第6章图

第1关&#xff1a;图-客观题测试 &#xff08;一&#xff09; 1、无向图中一个顶点的度是指图中&#xff08;&#xff09;。 A、通过该顶点的简单路径数 B、与该顶点相邻接的顶点数 C、与该顶点连通的顶点数 D、通过该顶点的回路数 2、以下说法正确的是&#xff08;&…

spring boot 2 升级到 spring boot 3 后文件上传失败

背景 项目需要&#xff0c;要求升级 spring boot 2.7 到 spring boot 3.2&#xff0c;升级过程中发现很多不兼容问题&#xff0c;下面说明文件上传失败的解决方案。 问题 spring boot 2 中不需要额外的配置&#xff0c;直接在 Controller 中配置 MultipartFile 接收页面传的…

Linix服务器添加dns解析

Linix开通互联网域名地址出现&#xff0c;如下错误&#xff1a; 需要访问的服务器上添加dns解析 vim /etc/sysconfig/network-scripts/ifcfg-ens192 添加如下配置&#xff1a; DNS1202.96.134.13 重启网卡&#xff1a; systemctl restart network 注意如果是docker服务部署…

利用github copilot完成代码,利用正则化完成字符串中信息查找

利用正则化完成字符串中的字符拆解。 下面的代码是实现在“计算机组成原理-计科2101-123456-小明同学.docx”中提取出班级&#xff08;grade&#xff09;&#xff0c;学号&#xff08;id&#xff09;&#xff0c;姓名&#xff08;name&#xff09;。以下的代码都是github copi…

vivado时序方法检查2

TIMING-4 &#xff1a; 时钟树上的基准时钟重新定义无效 时钟树上的时钟重新定义无效。基准时钟 <clock_name> 是在时钟 <clock_name> 下游定义的 &#xff0c; 并覆盖其插入延迟和/ 或波形定义。 描述 基准时钟必须在时钟树的源时钟上定义。例如 &#xff0…