InnoDB结构与表空间文件页的详解
目录
1.InnoDB的概览
表空间文件在哪里?
为什么要设计成内存结构和磁盘结构?
表空间与表空间文件关系?
用户数据如何在表空间文件存储?
2.页
如何设置页的大小?
页的结构及在表空间的位置?
页头包含的信息:
数据行
数据行的组成信息?
数据行如何组织在一起?
如何标识新页中第一行和最后一行?遍历页中数据从哪里开始哪里结束?
向新页中插入数据是如何执行的?
要查询的数据在某一页,如何定位他的位置?是一条条遍历吗
数据页的完整结构?
总结:关于页说了什么
InnoDB如何保证页在磁盘连续性?
数据很少时如何避免空间浪费?
4.区组
不同区在磁盘上大概率是不连续的,那么InnoDB如何管理区?
5.段
1.InnoDB的概览
InnoDB主要包括内存结构和磁盘结构。
内存结构包括:缓冲池,变更缓冲区,日志缓冲区,自适应哈希。
磁盘结构包括:系统表空间,独立表空间,通用表空间,临时表空间,撤销表空间,重做日志,双写缓冲区。
表空间文件在哪里?
表空间是用来存储表中数据的文件,表空间大小由存储的数据多少决定,不同表空间存储的数据种类不同。
InnoDB创建表,默认在数据目录对应的数据库子目录中生成相应的表空间文件。以 .ibd文件结尾
为什么要设计成内存结构和磁盘结构?
磁盘结构文件是用来保存数据持久化,内存结构是用来缓存数据提升效率的。
表空间与表空间文件关系?
表空间是MySQL为了管理数据设计的一种数据结构,表空间文件时对其具体实现。
用户数据如何在表空间文件存储?
以数据行的方式存在对应表空间,表空间有段,区组,区,页,数据行组合,页是最小单位。页的大小为16KB,这个大小可以尽可能减少磁盘的IO次数,提高性能。每次从磁盘读取一页数据放入内存,下次访问的数据大概率还在这个页中(局部性原理)。
多个数据行组成页,多个页组成区,多个区组成区组,多个区组组成段。
2.页
可以根据需要自定义页大小,16KB是默认值,但是调整页大小保证是4KB的整数倍。因为操作系统的文件系统管理磁盘文件就是4KB为一个管理单元。
设置innodb_page_size值,可以是4096,8192,16384,32768,65536对应4KB, 8KB , 16KB, 32KB, 64KB.
如何设置页的大小?
进入 /etc/mysql/ 目录中,修改my.cnf文件。
页的结构及在表空间的位置?
页有多种类型,但都包括页头,页尾,存储数据和索引的叫“索引页/数据页”。页主体有数据行构成
页都有哪些?
InnoDB在不同场景有数据页,Undo Log页,Change Buffer页,Extent Descriptor页,InnoDB段信息页等等。我们需要关注数据页,InnoDB有个概念叫“索引即数据”,所以也叫“索引页”。
页头页尾包含哪些信息?
页头包含的信息:
1.页号:4Byte,相当于身份证标识,可以看出InnoDB最多有 2^(4*8)-1约42亿个页,每个大小默认16KB,一共64TB,InnoDB表空间最大容量是64TB。
2.上一页页号:FIL_PAGE_PREV
3.下一页页号:FIL_PAGE_NEXT,多个页通过这两个信息组成双向链表,即使页地址不连续但也可以通过链表链接。
4.表空间ID:FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID,当前页属于哪个表空间
5.页类型:FIL_PAGE_TYPE
6.最近次修改的LSN:FIL_PAGE_LSN,占用8Byte
7.已经刷到磁盘的LSN:FIL_PAGE_FILE_FLUSH_LSN,占用8Byte
8.校验和:FIL_PAGE_SPACE_OR_CHKSUM ,用来校验页的完整性
页尾包含信息:
1.校验和:对应页头的完整性
2.最近次修改的LSN
数据行
除了页头页尾的区域叫“页主体”,页主体中包含数据行,还有提高查询效率的页目录Page Directory和方便操作管理数据页的数据页头。
数据行的组成信息?
数据行包含两部分,一部分是存储额外信息,一部分是存储真实数据。
额外信息包含变长字段长度列表和NULL值列表两个大小不确定的区域以及固定5字节的头信息
数据行如何组织在一起?
通过头信息中的下一行地址偏移量netx_record,将所有数据行组成一个单链表,这样的好处:向左是额外信息的头信息,向右是真实数据。如图:

如何标识新页中第一行和最后一行?遍历页中数据从哪里开始哪里结束?
创建新页会自动分配两行,一个行类型为2的最小行Infimun,heap_no位置固定为0号,一个行类型为3的最大行Supremun,heap_no位置固定为1号。
新页中没有数据时,最小行Infimun的next_record与最大行直接相连。
向新页中插入数据是如何执行的?
插入数据时,heap_no会从2开始依次递增,如果是真实数据record_type为0,如果是索引数据record_type为1。将Infimun连接第一个数据行,最后一行真实数据链接Supremun。
将页中记录真实数据区域叫“用户数据区”,未被数据行占有的叫“空闲区”。
要查询的数据在某一页,如何定位他的位置?是一条条遍历吗?
为提高查询效率,InnoDB用二分查找。
页中有叫“页目录(Page Directory)”的结构,将所有页内的数据行进行分组,最小行单独一组,每组8个数据行,按照主键从小到大。同时每组的最后一行放入称为“槽”的结构中,每个槽都记录在页中,如果分组超过8个,则会新增加一组,同时魅族最后一行会用n_owned记录每组数据的个数。
后续查找数据通过二分查找找到槽,在槽内8个数据中遍历。
例如:查找主键为6的行,先对比槽中记录的主键值,定位第二个槽,然后从该槽中遍历数据。
事务索引这些东西如何在槽中记录?
事务,索引这些全部储存在数据页头中
数据页的完整结构?
其实就是一个页的完整结构:页头,页尾,页目录,数据页头,最大行,最小行,数据行。
总结:关于页说了什么
1.设置页的大小
2.页的主要分类
3.页头,页尾包含什么信息
4.页主体组成部分
5.数据行的组成部分
6.数据页头包含的统计和描述信息
3.区
InnoDB如何保证页在磁盘连续性?
在磁盘中地址不连续访问的效率会降低,于是尽可能在磁道上读取连续数据减少磁头移动,MySQL用区来管理页,大小1MB,存放64个页,就算跨页读取数据,大概率目标页也在这个区里
如果频繁读取某区中的页,可以把整个区读取到内存里,进一步提升效率。
数据很少时如何避免空间浪费?
在MySQL8.0后,一开始创建7个页放在叫碎片区的区域,不是完整的区。数据量增加申请新的页,页的数量到32个,后续申请完整的区来存储这些页。
4.区组
不同区在磁盘上大概率是不连续的,那么InnoDB如何管理区?
数据量越来越大,区越来越多。MySQL定义了区组的结构,每个区组管理256个区即256MB,这样可以高效定位到每个区。
5.段
以上数据结构还有优化的空间,就是用“段”,段的作用来区分在不同功能的区和碎片区中的页,段分为“叶子节点段” 和 “非叶子节点段”作为B+树索引中的叶子,非叶子节点提高查询效率 。非叶子节点段用来储存和管理索引树 ,叶子节点储存管理实际数据。 逻辑上呢,由“叶子节点段”和“非叶子节点段”组成表空间文件 “.ibd"
相关文章:

InnoDB结构与表空间文件页的详解
目录 1.InnoDB的概览 表空间文件在哪里? 为什么要设计成内存结构和磁盘结构? 表空间与表空间文件关系? 用户数据如何在表空间文件存储? 2.页 如何设置页的大小? 页的结构及在表空间的位置? 页头包…...

世界无人机大会将至,大势智慧以“AI+实景三维”赋能低空经济
近日,“2025第九届世界无人机大会暨国际低空经济与无人系统博览会和第十届深圳国际无人机展览会”组委会召开新闻发布会,宣布本届大会主题为“步入低空经济新时代”,将于5月23-25日在深圳会展中心(福田)举行࿰…...

AI 驱动数据库交互技术路线详解:角色、提示词工程与输入输出分析
引言 在人工智能与数据库深度融合的趋势下,理解AI在数据库交互流程中的具体角色、提示词工程的运用以及各步骤的输入输出情况,对于把握这一先进技术路线至关重要。本文将对其展开详细剖析。 一、AI 在数据库交互流程中的角色 (一࿰…...
AI 助力,轻松进行双语学术论文翻译!
在科技日新月异的今天,学术交流中的语言障碍仍然是科研工作者面临的一大挑战。尤其是对于需要查阅大量外文文献的学生、科研人员和学者来说,如何高效地理解和翻译复杂的学术论文成为了一大难题。然而,由Byaidu团队推出的开源项目PDFMathTrans…...

stm32错误记录
1.使用LCD屏幕时,只用st-link时,亮度很暗,需要用usb数据线额外给屏幕供电; 2.移植freertos到f103c8t6芯片时,工程没有错误,但单片机没有反应; 需要将堆的大小改成10*1024; 3.在找已经…...
Baumer工业相机堡盟工业相机的工业视觉中为什么偏爱“黑白相机”
Baumer工业相机堡盟工业相机的工业视觉中为什么偏爱“黑白相机” Baumer工业相机为什么偏爱“黑白相机”?工业视觉中为什么倾向于多使用黑白相机黑白相机在工业视觉中的应用场景有哪些? Baumer工业相机 工业相机是常用与工业视觉领域的常用专业视觉…...
前端取经路——现代API探索:沙僧的通灵法术
大家好,我是老十三,一名前端开发工程师。在现代Web开发中,各种强大的API就像沙僧的通灵法术,让我们的应用具备了超乎想象的能力。本文将带你探索从离线应用到实时通信,从多线程处理到3D渲染的九大现代Web API,让你的应用获得"通灵"般的超能力。 在前端取经的第…...

一个电平转换电路导致MCU/FPGA通讯波形失真的原因分析
文章目录 前言一、问题描述二、原因分析三、 仿真分析四、 尝试的解决方案总结前言 一、问题描述 一个电平转换电路,800kHz的通讯速率上不去,波形失真,需要分析具体原因。输出波形如下,1码(占空比75%)低于5V,0码(占空比25%)低于4V。,严重失真。 电平转换电路很简单,M…...

OpenLayers根据任意数量控制点绘制贝塞尔曲线
以下是使用OpenLayers根据任意数量控制点绘制贝塞尔曲线的完整实现方案。该方案支持三个及以上控制点,使用递归算法计算高阶贝塞尔曲线。 实现思路 贝塞尔曲线原理:使用德卡斯特里奥算法(De Casteljau’s Algorithm)递归计算任意…...

STM32--RCC--时钟
教程 系统时钟 RCC RCC(Reset and Clock Control)是STM32微控制器中管理时钟和复位系统的关键外设模块,负责整个芯片的时钟树配置和复位控制。 RCC主要功能 时钟系统管理: 内部/外部时钟源选择 时钟分频/倍频配置 各外设时钟门…...
uniapp 不同路由之间的区别
在UniApp中,路由跳转是实现页面导航的核心功能,常见的路由跳转方式包括navigateTo、redirectTo、reLaunch、switchTab和navigateBack。这些方法在跳转行为和适用场景上有所不同。 一、路由跳转的类型与区别 1. uni.navigateTo(OBJECT) 特点࿱…...
mysql 已经初始化好,但是用 dbeaver 连接报错:Public Key Retrieval is not allowed
MySQL 已经初始化好,但用 DBeaver 连接时报错 “Public Key Retrieval is not allowed”,这是 MySQL 8 默认认证插件 caching_sha2_password 导致的安全限制问题。解决方法如下: 解决方案 1. 在 DBeaver 中开启 allowPublicKeyRetrievaltru…...
Spring 项目无法连接 MySQL:Nacos 配置误区排查与解决
在开发过程中,我们使用 Nacos 来管理 Spring Boot 项目的配置,其中包括数据库连接配置。然而,在实际操作中,由于一些概念的混淆,我们遇到了一些连接问题。本文将分享我的故障排查过程,帮助大家避免类似的错…...

仿腾讯会议——创建房间加入房间
等等...

Linux系统入门第十二章 --Shell编程之正则表达式
一、正则表达式 之前学习了 Shell 脚本的基础用法,已经可以利用条件判断、循环等语句编辑 Shell脚本。接下来我们将开始介绍一个很重要的概念-正则表达式(RegularExpression,RE) 1.正则表达式的定义 正则表达式又称正规表达式、常规表达式。在代码中常…...

[架构之美]Spring Boot多环境5种方案实现Dev/Test/Prod环境隔离
[架构之美]Spring Boot多环境5种方案实现Dev/Test/Prod环境隔离(十六) 摘要:本文深入剖析Spring Boot多环境配置的5种实现方案,涵盖YAML分组配置、Maven Profile集成、Kubernetes适配等企业级实践,并附赠配置加密方案…...

C++STL——stack,queue
stack与queue 前言容器适配器deque 前言 本篇主要讲解stack与queue的底层,但并不会进行实现,stack的接口 queue的接口 ,关于stack与queue的接口在这里不做讲解,因为通过前面的对STL的学习,这些接口都是大同小异的。 …...

解决社区录音应用横屏状态下,录音后无法播放的bug
最近看到社区有小伙伴反映,社区录音应用横屏时,录音后无法播放的问题。现分享解决办法。 社区录音应用的来源:https://gitee.com/openharmony/applications_app_samples/tree/OpenHarmony-5.0.2-Release/code/SystemFeature/Media/Recorder …...

专业级软件卸载工具:免费使用,彻底卸载无残留!
在数字生活节奏日益加快的今天,我们的电脑就像每天都在"吃进"各种软件。但您是否注意到,那些看似消失的程序其实悄悄留下了大量冗余文件?就像厨房角落里积攒的调味瓶空罐,日积月累就会让系统变得"消化不良"。…...
前端开发实战:用React Hooks优化你的组件性能
问题背景 在前端开发中,React组件的性能优化是一个常见挑战。尤其是当组件逻辑复杂或数据频繁更新时,性能问题尤为突出。本文将介绍如何利用React Hooks(如useMemo和useCallback)来优化组件性能。 解决方案 useMemo:用…...

JVM对象创建内存分配
对象创建的主要流程: 检查加载类–》分配内存–》初始化–》设置对象头–》实例化,执行init方法。 在内存分配中,虚拟机将为新生对象内存分配 Minor GC : 新生代垃圾收集,特点是频繁,回收速度快; Full GC …...
华为云Git使用与GitCode操作指南
目录 1 概述 1.1 背景介绍 1.2 案例流程 1.3 资源总览 2 GitCode基础使用 2.1 GitCode注册 2.2 项目创建 3 云主机上Git常用基础命令使用 3.1 Git工具安装检查 3.2 git config 全局设置 3.3 git clone 创建仓库 3.4 git init 仓库初始化 3.5 git add/remove 文件添…...
标量/向量/矩阵/张量/范数详解及其在机器学习中的应用
标量(Scalar)、向量(Vector)、矩阵(Matrix)、张量(Tensor)与范数(Norm)详解及其在机器学习中的应用 1. 标量(Scalar) 定义࿱…...

PySide6 GUI 学习笔记——常用类及控件使用方法(常用类边距QMarginsF)
文章目录 类简介方法总览关键说明示例代码 类简介 QMarginsF 用于定义四个浮点型边距(左、上、右、下),描述围绕矩形的边框尺寸。所有边距接近零时 isNull() 返回 True,支持运算符重载和数学运算。 方法总览 方法名/运算符参数返…...

STM32实现九轴IMU的卡尔曼滤波
在嵌入式系统中,精确的姿态估计对于无人机、机器人和虚拟现实等应用至关重要。九轴惯性测量单元(IMU)通过三轴加速度计、陀螺仪和磁力计提供全面的运动数据。然而,这些传感器数据常伴随噪声和漂移,单独使用无法满足高精…...

机器学习-简要与数据集加载
一.机器学习简要 1.1 概念 机器学习即计算机在数据中总结规律并预测未来结果,这一过程仿照人类的学习过程进行。 深度学习是机器学习中的重要算法的其中之一,是一种偏近现代的算法。 1.2 机器学习发展历史 从上世纪50年代的图灵测试提出、塞缪尔开发…...

算法训练营第十三天|226.翻转二叉树、101. 对称二叉树、 104.二叉树的最大深度、111.二叉树的最小深度
递归 递归三部曲: 1.确定参数和返回值2.确定终止条件3.确定单层逻辑 226.翻转二叉树 题目 思路与解法 第一想法: 递归,对每个结点进行反转 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, le…...

二叉树的遍历与构造
好想回家,我想回家跟馒头酱玩,想老爸老妈。如果上天再给我一次选择的机会,我会选择当一只小动物,或者当棵大树也好,或者我希望自己不要有那么多多余的情绪,不要太被别人影响,开心点,…...
Python+OpenCV实现手势识别与动作捕捉:技术解析与应用探索
引言:人机交互的新维度 在人工智能与计算机视觉技术飞速发展的今天,手势识别与动作捕捉技术正逐步从实验室走向大众生活。通过Python的OpenCV库及MediaPipe等工具,开发者能够以较低门槛实现精准的手部动作识别,为虚拟现实、智能家…...

MYSQL服务的使用流程
MYSQL是一个单进程多线程,支持多用户,基于客户机/服务器的关系数据库管理系统。与其他数据库管理系统相比,MYSQL具有体积小,易于安装,运行速度快,功能齐全,成本低廉以及开源等特点。MYSQL可运行…...