Mysql原理与调优-InnoDB页结构

news2025/1/12 12:01:13

目录

1.绪论

2.Mysql的数据页组成

2.1 基本组成

2.1 文件头

2.2 页头部(Page Header)

3.3 infimum + supremum

3.4 用户记录 和 空闲空间

3.4.1 用户插入数据步骤

3.4.2 删除数据

3.5 页目录

3.5.1 插入时维护槽的步骤

3.5.2 查询元素的步骤

3.总结


1.绪论

前面讲Mysql的行记录结构的时候,曾经说过,Mysql每次与磁盘的IO操作是以数据页为单位的。每个数据页大小为16kb。而一个数据页存储多条行记录,这里就来介绍一下Mysql的数据页的组成。

2.Mysql的数据页组成

2.1 基本组成

Mysql的数据页由如下几部分组成。即38个字节的文件头,56个字节的数据页头,26个字节的最大和最小两条记录,已经已经使用的用户空间,未使用的空闲空间和8字节的文件尾组成。

2.1 文件头

文件头部主要存储的是当前文件的信息。其组成如下:

字段名称说明
FIL_PAGE_SPACE_OR_CHKSUM该页文件的校验和
FIL_PAGE_OFFSET页号,当前页的唯一标识
FIL_PAGE_PREV上一页的指针
FIL_PAGE_NEXT下一页的指针
FIL_PAGE_LSN页面最后被修改的日志的位置
FIL_PAGE_TYPE表示该页是什么类型,常见的有索引页,undo页,事务页等
FIL_PAGE_FILE_FLUSH_LSN
FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID该页属于什么表空间

我们主要关注的是FIL_PAGE_PREV和FIL_PAGE_NEXT这两个字段,通过这两个字段,将数据页串成了一个双端链表。如下:

2.2 页头部(Page Header)

页头存储的主要是关于当前数据页的一些信息,比如当前文件有多少个槽,当前页有多少条记录,当前页被删除了多少条记录等。

3.3 infimum + supremum

在数据页中,记录在逻辑上是按照主键id排序,并且通过每条记录里面的next_record字段串成一个单向链表。那这个链表的头部就是infimum,尾部就是supremum。

其中infimum的记录的type为2,并且其固定为13个字节,存储的记录内容就是`infimum`这个字符串。

而supremum的记录type为3,并且其固定位13个字节,存储的记录内容就是`supremum`这个字符串。

3.4 用户记录 和 空闲空间

3.4.1 用户插入数据步骤

1.用户插入数据的时候,首先需要判断空闲空间是否足够存储这条需要插入的数据,如果不够,需要开启新的页来存储。

2.如果足够,用户会直接将数据按照顺序插入,前面说的记录头中的字段heap_no表示的就是当前记录是该记录堆中的第几条记录。

3.插入完成过后,会维护一个按照主键大小排列的顺序链表,其中next_record就是这个链表的指针。

如下:

3.4.2 删除数据

删除数据时,用户会将该记录的delete_mask设置为1,并且将其加入到垃圾链表中,当剩余空间不足时,垃圾链表里面的这些内存可以被复用。

3.5 页目录

Innodb中的记录通过单向链表将记录从小到大链接,总所周知,顺序结构,可以考虑采用二分查找的方式,将查找复杂度降为O(logn)。所以Innodb维护了一个索引数组,每隔2-8个节点分为一组,并便每组的最后一个节点记录在该数组里面。这个数组就是页目录,该数组的每个元素称之为槽。

3.5.1 插入时维护槽的步骤

1.初始插入时,页目录数组中只有两个分组,分别是最小记录所在分组和最大记录所在分组。其中最小记录所在组最多只能有1条记录,最大记录所在分组最多只能有1-8条记录,其他分组最多为4-8条记录。

2.当新的元素进入的时候,会找比自己本记录大,并且差值最小的槽, 并且将起n_owned值加1,表示加入的元素归属于该组。

3.如果该组的元素超过8个值,会将该组分成两个组,一个组4个元素,一个组5个元素,并且会将他们维护在页目录数组中。

3.5.2 查询元素的步骤

1.首先查询到当前页(如何查找,后面讲解);

2.将当前主键id和通过二分查找在页目录数组中找到,当前页是属于哪个分组;

3.在该分组中遍历比较,得到对应元素。

3.总结

综上,结合前一章,Mysql的记录的讲解,我们可以对数据是如何存储在Mysql中的有一个大概认识。即每页大小为16kb,通过文件头的前向指针和后向指针,链接成一个双端链表。链表内部,每条记录物理上顺序插入,在逻辑上回根据记录的next_record属性,串成一个按照主键大小排列的单向链表。为了查询更快,每页会维护一个页目录,将记录组成的单向链表分成不同的组,并且将每组的最大元素的偏移量记录在页目录数组中。

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

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

相关文章

为之“毫厘”、追之“千里”,“仅退款”的存废之争

文丨郭梦仪 橘子(化名)看到了待审核的起诉书,气不打一处来。这次白嫖行为橘子不打算再忍了。 橘子是拼多多商家,经营化妆品公司,5月份,一个顾客收到货4天说用了过敏,直接退款没有退回产品。橘…

Project Euler_Problem 587_Concave Triangle (背包问题)

原问题&#xff1a; 代码&#xff1a; void solve() {ll i, j, k, p, q, u, v, l, r, x, y, z, z1;z 0;double a, b, c;N 1e9;n 250250;p 1e16;z 250;for (i 1; i < n; i) {C[i] M.NT.prime_pow(i, i, z);}A[0] 1;for (i 1; i < n; i) { x C[i];for (j …

潮流时尚,音质在线的悠律ringbuds pro开放式耳机体验评测

选购耳机时你最看重的要素是什么&#xff1f;对笔者来说&#xff0c;“音质”绝对排在了第一位。然而&#xff0c;当前市场上多数开放式蓝牙耳机音质和舒适性欠佳&#xff0c;让人难以抉择。最近悠律声学品牌推出全新的 OWS 蓝牙耳机ringbuds pro&#xff0c;它以卓越音质、时尚…

streamlit (python构建web)之环境搭建

目录 前言 1. 什么是Streamlit&#xff1f; 2. Streamlit的原理 2.1 demo1-运行计时程序 2.2 demo2-随即密码生成器 3. 安装Streamlit 3.1 安装方式一 3.2 安装方式二 3.2.1 安装 conda 3.2.2 新建一个 conda 环境 3.2.3 激活 conda 环境 3.2.4 安装 Streamlit 库 …

微信小程序教程011-2:京西购物商城实战之TabBar实现

2、tabBar 2.0 创建tabBar分支 运行如下命令,基于master分支,创建本地tabBar子分支,用来开发和tabBar相关的功能 git checkout -b tabbar2.1 创建tabBar页面 在pages目录中,创建首页(home)、分类(cate)、购物车(cart)、我的(my)这4个tabBar页面,在HBuilderX中…

PADS文件与AD文件如何相互转换?

大家好&#xff0c;我是山羊君Goat。 在电子硬件设计中&#xff0c;常常用用到3款EDA设计软件&#xff1a;Altium Designer, Pads, cadence。 Altium Designer: 在高校中使用非常普遍&#xff08;相信很多硬件工程师接触的第一款设计软件就是Altium Designer&#xff09;&…

Python 用户输入和while循环

1、input()函数的工作原理&#xff08;用户输入&#xff09; input()函数让程序暂停运行&#xff0c;等待用户输入一些文本。获取用户输入后&#xff0c;Python将其赋给变量&#xff0c;以其使用。 在input()函数接受一个参数&#xff0c;既要向用户显示的提示&#xff0c;为了…

Flink 实时数仓(八)【DWS 层搭建(二)流量域、用户域、交易域搭建】

前言 今天的任务是完成流量域最后一个需求、用户域的两个需求以及交易域的部分需求&#xff1b; 1、流量域页面浏览各窗口汇总表 任务&#xff1a;从 Kafka 页面日志主题读取数据&#xff0c;统计当日的首页和商品详情页独立访客数。 注意&#xff1a;一般我们谈到访客&…

广东省造林绿化施工丙级资质2024年9月开通申报

关于广东省造林绿化施工丙级资质2024年9月的申报情况&#xff0c;可以归纳如下&#xff1a; 一、申报时间 具体时间&#xff1a;2024年9月1日至9月30日。在此期间&#xff0c;相关企业可以在网上提交申请。 二、申报条件 资历和信誉 1、独立企事业法人资格&#xff1a;申请…

程序跟随系统主题色切换主题

如果程序要跟随系统主题色进行切换&#xff0c;需监听当前系统的主题色&#xff0c;下面介绍Windows和MacOS下获取当前系统主题的方法 Windows 系统切换主题 以win10为例&#xff0c;点击右键选择个性化&#xff0c;进入个性化页面&#xff0c;选择左侧颜色的Tab&#xff0c…

mp3格式转换器哪个好用?汇总七款音频格式转换方法(无损转换)

音乐已经成为我们生活中不可或缺的一部分。但是在播放的时候&#xff0c;可能会遇到音频格式不兼容的情况。特别是在一些下载站或音乐平台获取的音频&#xff0c;有些特殊格式在播放器上无法正常播放&#xff0c;一般这种情况我们需要借助mp3转换器解决。 mp3是一种常见的数字音…

三更的springsecurity课程个人笔记总计4万字,全部测试通过,代码cv即可

SpringSecurity b站 40.源码讲解部分说明_哔哩哔哩_bilibili BV1mm4y1X7Hc 以下全为个人总结&#xff0c;不能代表官方&#xff0c;有错误还请指出&#xff08;全部测试通过&#xff09;&#xff08;1刷视频&#xff09; 1-简介 tip 接下来的所有类不会包含import信息&am…

爬虫代理教程:爬虫代理池部署+高并发实现方法

在数据爬取的世界里&#xff0c;代理IP就像是爬虫的隐身衣&#xff0c;帮助我们在网络上自由穿梭&#xff0c;避免被目标网站识别封禁。今天我就来分享一下爬虫代理池的部署和高并发实现的技巧&#xff0c;希望能对大家有所帮助。 什么是爬虫代理池&#xff1f; 首先&#xf…

nginx下载安装及使用教程

一、打开下载官网&#xff1a;nginx 选择稳定版本&#xff08;windows&#xff09; 然后就是解压安装到指定目录下 二、启动nginx 使用cmd命令提示符进入&#xff0c;输入一下命令(注意&#xff1a;回车确认是会出现一闪&#xff0c;这是正常现象&#xff09; 查看任务进程是否…

Flink学习之Flink SQL(补)

Flink SQL 1、SQL客户端 1.1 基本使用 启动yarn-session yarn-session.sh -d启动Flink SQL客户端 sql-client.sh--退出客户端 exit;测试 重启SQL客户端之后&#xff0c;需要重新建表 -- 构建Kafka Source -- 无界流 drop table if exists students_kafka_source; CREATE TABL…

SourceTree配置多个不同Remote地址的仓库

需求 在我们开发过程中&#xff0c;有可能需要拉取的地址仓库不在同一个仓库中&#xff0c;有些可能在Github上&#xff0c;有些可能在Gitlab上。 所以我们需要配置Github的仓库的配置和Gitlab仓库的配置。 现在&#xff0c;我们来配置两个不同的仓库的地址。 假设&#xf…

快速体验LLaMA-Factory 私有化部署和高效微调Llama3模型FAQ

序言 之前已经介绍了在超算互联网平台SCNet上使用异构加速卡AI 显存64GB PCIE&#xff0c;私有化部署Llama3模型&#xff0c;并对 Llama3-8B-Instruct 模型进行 LoRA 微调、推理和合并 &#xff0c;详细内容请参考另一篇博客&#xff1a;快速体验LLaMA-Factory 私有化部署和高…

Android14音频进阶之命令行播放音频(八十)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 新书发布:《Android系统多媒体进阶实战》🚀 优质专栏: Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏: 多媒体系统工程师系列【原创干货持续更…

SpringDI(依赖注入)的理解

目录 一、什么是SpringDI&#xff1f; 二、SpringDI&#xff08;依赖注入&#xff09;的作用是什么&#xff1f; 三、DI的实现方式 3.1 set注入 1.项目结构&#xff1a; 2.set注入对象 2.1applicationContext.xml&#xff1a; 2.2 Student 实体类 2.3 controller: 2.4 da…

SpringIOC容器对Bean管理

一、bean实例化 1.通过构造方法&#xff08;默认&#xff09; 2.通过工厂方法 3.通过静态工厂方法 项目结构&#xff1a; 1. 通过构造方法&#xff08;默认&#xff09; 1.1 pojo实体类&#xff1a; Student: public class Student {public Student() {System.out.println…