MYSQL 中的表空间

2023-11-10

MYSQL中的表空间

MYSQL 的表空间可以理解为其存储在物理磁盘上的 表名.ibd 文件,MYSQL 为了管理方便,增加了很多概念,来一一了解一下。

逻辑概念:Segment

在 B+树的根页面的中,存储了两个 10 字节的字段,PAGE_BTR_SEG_LEAF,
PAGE_BTR_SEG_TOP,这两个字段存储的为 Segment Header 结构,即段头,通过这个字段,可以在表空间中定位到一个 INODE ENTRY 的结构,每个 INODE ENTRY 结构对应一个段。
段是什么呢?段是一个逻辑概念,是 MYSQL 为了优化 磁盘 IO 而提出的,MYSQL 的数据是存储在页里面的,一个页 16KB,同一层的页通过双向链表连接在一起,通过这个双向链表查询数据是随机 IO,因为同一层的页在物理空间上可能不连续,为了优化随机 IO,MYSQL 在页的基础上,提出了区 extent 的概念,一个区由 64 个页组成,也就是 1MB,在段的大小超过 32 个页后,会直接分配若干个区,来存储数据。
这个 INODE ENTRY 结构中即存储了段所对应的一些零散的页面地址以及一些完整的区的地址。

先来看一下向某个段中插入数据的过程:

  • 当段中的数据比较少的 时候,首先会查看表空间中是否有状态为 FREE_FRAG 的区,如果有的话,就直接从里面取出一写零散的页,把数据放进去;否则从表空间申请一个状态为 FREE 的区,把他的状态变为 FREE_FRAG,在从里面申请若干个页,之后不同的段是否零散的页都从这个区里面取,最后区满后,就把其状态变为 FULL_FRAG。 那么如何确定一个区的状态呢? 通过链表的方式:
    1. FREE 链表:状态为 FREE 的区,形成的链表
    2. FREE_FRAG 链表:状态 为 FREE_FRAG 的区,形成的链表
    3. FULL_FRAG 链表:状态为 FULL_FRAG 的区,形成的链表
    这三个链表是属于表空间管理的,因此其存储于表空间的第 0 号页面里面,其页面类型为 FSP_HDR,为了管理每个链表,MYSQL 定义了 LIST BASE NODE,通过这个 NODE,可以快速的得到链表的长度、头节点、尾节点。
  • 当表中的数据占满 32 个页之后,就申请完整的区来插入数据。那么如何确定哪个区属于哪个段呢?还是通过链表的方式来确定的,对于每个段,其会有三个链表
    1. FREE 链表:同一个段中,所有页面都是空闲的区,会被加入到这个链表
    2. NOT_FULL 链表:同一个段中,仍然后空闲的区,会被加入到这个链表
    3. FULL 链表:同一个段中,已经没有空闲的区,会被加入到这个链表

物理概念:区

表空间中的区,对应的就是 64 个连续的页,每个页 16Kb,那就是 1 MB 大小,
区的分类

  1. 空闲的区:现在还没有用到这个区中任何页面
  2. 有剩余空间的碎片区:表示这个碎片区中还有可用的页面,这些页面可能用于某个段,也可能用于 INODE 类型的页面。
  3. 没有剩余空间的碎片区:表示这个碎片区中没有可用的页面
  4. 附属某个段的区:每个索引都有叶子节点段和非叶子节点段,在段中的数据很大时,将使用区作为基本的分配单位

物理改变:组

一个组由 256 个区组成,即 256MB 大小,每个组的第一个页面包含了描述区信息的页面,第二个页面包含了描述 Change Buffer 的信息(不懂,暂时放下)。

不过第一个组略有不同,其第一个页面为 FSP_HDR,除了包含描述区信息外,还包含了描述表空间的信息;第三个页面为 INODE 类型的页面,这个页面里面存储了 INODE ENTRY 结构,来存储关于段的信息。

表空间中的链表

直接用于表空间管理区的有 5 个链表

  1. FREE 链表
  2. FREE_FRAG 链表
  3. FULL_FRAG 链表
    这三个链表连接起来的是 XDES ENTRY 结构,对应的是区的物理结构。
    用于表空间管理段的有 2 个链表
  4. SEG_INODES_FULL 链表:该链表对应的 INODE 类型页面,没有额外空间存储新的 INODE ENTRY 结构
  5. SEG_INODES_FREE 链表: 该链表对应的 INODE 类型页面,有 额外空间存储新的 INODE ENTRY 结构
    这三个链表连接起来的是页的结构,页的类型为 INODE 类型

段用于管理的链表:

  1. FREE 链表:
  2. NOT_FULL 链表:
  3. FULL 链表:
    这三个链表连接起来的是 XDES Entry 结构,对应的是区的物理结构。

ps: 以上知识整理于掘金小册《MySQL是怎样运行的从根儿上理解MySQL》,小册的内容,比我 总结的要详细多了,大家也可以在上面看看。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MYSQL 中的表空间 的相关文章

  • 同时使用 GUID 和自动递增整数

    我一直在研究使用 GUID 作为数据库中的主键 到目前为止 利似乎大于弊 然而 我发现 GUID 可能不是我想要的 在我的应用程序中 用户应该能够根据用户友好的 ID 来识别对象 因此 例如 如果他们想要获取特定产品而不输入全名 则可以使用
  • 合并两个 MYSQL SELECT 查询[重复]

    这个问题在这里已经有答案了 可能的重复 如何将两个 Post Category 表 MYSQL SELECT 查询合并为一个 https stackoverflow com questions 12972130 how to combine
  • 即使没有结果也返回一个值

    我有这种简单的查询 它返回给定 id 的非空整数字段 SELECT field1 FROM table WHERE id 123 LIMIT 1 问题是如果找不到 id 结果集就是空的 我需要查询始终返回一个值 即使没有结果 我有这个东西工
  • SQL Join 列上类似于另一列[重复]

    这个问题在这里已经有答案了 可能的重复 mysql连接查询使用like https stackoverflow com questions 1930809 mysql join query using like 我想要进行连接 其中一列包含
  • 使用Perl/DBI/MySQL/InnoDB查找外键信息

    我想以编程方式查找 MySQL 数据库中特定 InnoDB 表的外键 我正在使用 Perl 我偶然发现 dbh gt foreign key info 我刚刚尝试使用它 但似乎有点错误 它不会返回 ON DELETE 和 ON UPDATE
  • 无法在 Mac 上启动 MySQL

    使用 Brew 安装后 我无法运行 MySQL 我使用的是 OS X El Capitan 版本 10 11 3 和 MySQL Server 版本 5 7 11 当我启动服务器时 我收到 启动 MySQL 错误 服务器退出而不更新 PID
  • Android Realm.io:行/对象不再有效

    这是我的删除功能 它确实找到了workday1 object public static void delete Context context Workday workday Realm realm getRealm context re
  • 非常大的字段会对 MySQL 数据库产生负面影响吗?

    我目前正在使用 Django 构建一个网站 并希望托管用户生物样式页面 该页面可能长达几 KB 这些字段不一定需要搜索 但在查找用户名时确实需要提供 将这些数据存储在数据库中会产生负面影响吗 如果我使用带有数据库链接的静态文本文件 我的服务
  • 让登录更安全

    我已使用此代码进行管理员登录 仅当用户输入正确的用户名和密码时才应打开loginhome php 但后来我意识到这根本不安全 任何人都可以直接访问 mywebsite loginhome php 而无需登录 注销后 可以使用后退按钮打开 l
  • 数据库字段中的逗号分隔值

    我有一个产品表 该表中的每一行对应一个产品 并由唯一的 ID 标识 现在 每个产品都可以有多个与该产品关联的 代码 例如 Id Code 0001 IN ON ME OH 0002 ON VI AC ZO 0003 QA PS OO ME
  • 如何通过 SQL 表关联 SQL 中的实体

    我是数据库设计的初学者 我需要为项目创建数据库 我可以用面向对象的术语解释我想要做什么 值得庆幸的是 数据库专家会很友善地向我解释如何在数据库方面处理这个问题 我想创建一个与位置实体 州 城市 有关系的用户 ID 名称 实体 所以在编程语言
  • PHP MySQL 使用选项/选择 HTML 表单标签进行多重搜索查询

    我正在尝试使用两个搜索字段设置基本的 MySQL LIKE 搜索 我不想拥有它 所以它有多个可选搜索字段 例如if isset POST city isset POST name 我不知道如何用 HTML 来做到这一点
  • rake db:migrate db:reset 和 db:schema:load 之间的区别

    和 之间的不同rake db migrate and rake db reset我很清楚 我不明白的是如何rake db schema load与前两者不同 只是为了确保我在同一页面上 rake db migrate 运行尚未运行的迁移 r
  • 如何处理数据库中的巨大结果集

    我正在设计一个多层数据库驱动的 Web 应用程序 SQL 关系数据库 用于中间服务层的 Java 用于 UI 的 Web 语言其实并不重要 中间服务层执行数据库的实际查询 用户界面只是要求某些数据 并不知道它是由数据库支持的 问题是如何处理
  • SQL查询查找表的主键?

    我怎样才能找到哪一列首要的关键使用查询来创建表 这是重复的question https stackoverflow com questions 893874 mysql determine tables primary key dynami
  • MYSQL从每个类别中随机选择一条记录

    我有一个数据库Items表看起来像这样 id name category int 有几十万条记录 每个item可以是 7 种不同的之一categories 对应于categories table id category 我想要一个从每个类别
  • MySQL 追加字符串

    How can I append a string to the end of an existing table value Let s say I have the table below And let s say that Mari
  • mysql排序和排名语句

    我需要一些 mysql 语句的帮助 我的表 1 有 7 列 表 2 有 8 列 额外的列名为排名 我的语句应该是这样的 从表 1 中选择全部 然后按 用户数 排序 将其插入表 2 中并排名开始 1 2 3 等 table 1 usernam
  • 通知设置的数据库设计

    用户可以打开或关闭 他的通知设置 帐户 用于通知 例如 更改帐户资料信息 收到新消息等 通知可以通过电子邮件或手机 推送或短信 发送 用户可以只有 1 封电子邮件和多个手机设备 有什么方法可以改进以下数据库设计或者您会采取不同的方式吗 让我
  • post php mysql 的拆分关键字

    我有一个表存储帖子 ID 它的标签如下 Post id Tags 1 keyword1 keyword2 keyword3 我想循环遍历该表中的每一行并执行以下操作 将关键字1 关键字2 关键字3放入新表中 word id word val

随机推荐

  • NASM与link、golink和alink具体例子使用对比

    一 OMF文件格式链接 使用import伪指令 import伪指令可以直接使用函数名 而不用给函数名加上 前缀和 number 后缀 但import伪指令仅适合于OMF borland obj 格式输出 OMF格式是MS在16位下操作系统的
  • vue awesome swiper 轮播图 循环不了 无法自动播放 loop无效 autoplay无效 蓝圈 解决办法

    vue awesome swiper 轮播图循环不了 无法自动播放 loop无效 autoplay无效 解决办法 出现问题 1 轮播图无法自动播放 2 swiper opagination为蓝色圈如何变成白色圈 3 loop无效 对应的解决
  • QT 一信号对应多个槽函数

    网络上搜索 大部分都废话连篇 直接上码测试此功能 结果显示OK 分别创建三个类 A B C 信号和槽绑定关系如下 一个信号绑定两个槽函数 A A QObject parent QObject parent B b new B C c new
  • CentOS7安装详细教程

    VM安装CentOS 7详细教程 通过VM安装CentOS7虚拟机的全部过程 并自动配置IP地址和DNS服务器 可以进行联网 1 软件准备 VM12 软件 安装包下载地址 云盘链接 VM12软件安装包下载地址 提取码 5lgm CentOS
  • 微信企业号,回调模式开通.net

    企业号每个应用有普通模式和回调模式两种 普通模式直接打开网页 回调模式可设置应用底部菜单项 可增加交互开发 可把客户端的操作事件传给企业服务器 企业服务器做响应开发 开通回调模式 首先需要通过url的回调验证 那么进入应用后台设置项 设置好
  • Vue2学习计划二:mustache与methods和computed等Vue实例参数

    上一节写了Vue实例的生命周期 我们心里有了个Vue里的数据绑定至DOM 那么具体怎么实现的呢 要实现只需要在Vue绑定的DOM元素中使用mustache语法即可 简单例子如下 div h2 message h2 hr h3 全名 full
  • (一)ideal 创建springboot工程和实现简单配置

    新建 IDEA project 选择Spring Initializr Choose Initializr Service URL 选择 Default Https start spring io 点击 next 进入下一步 提示 1 sp
  • Keil for arm 关于enit0 快速中断(FIQ)的响应

    本文原创 版权所有 如需转载 请注明出处 接着上篇讲arm7对于普通中断的响应 今天讲一下 关于快速中断的响应 步骤1 基础环境 arm7 LPC2106 Realview 4 2 编译环境默认 步骤2 starup s文件 启动代码 和i
  • adb shell 报错error: device unauthorized

    2022 7 29 oppo r11s 安卓8 亲测成功 windows电脑在链接安卓设备后 想要进行终端命令行进入到该设备 出现报错 报错内容 C Users gt adb shell error device unauthorized
  • 机械手使用者坐标系和工具坐标系_发那科机器人应用-坐标系介绍(2)

    工具坐标系 由工具中心点 的位置 和工具的姿势 构成 工具中心点 的位置 通过相对机械接口坐标系的工具中心点的坐标值 来定义 工具的姿势 通过机械接口坐标系的 轴 轴 轴周围的回转角 来定义 工具中心点用来对位置数据的位置进行示教 在进行工
  • Linux系列:Linux中如何安装.rpm、.tar、.tar.gz和tar.bz2文件

    我以下面三个包为例 三个包都在 etc opt下 A example 1 2 3 1 rpm B example 1 2 3 1 tar C example 1 2 3 1 tar gz 1 安装rpm包 说起RPM REDHAT Pack
  • 关于QtCreator 4.8 创建工程时,选中创建界面(.ui)无法创建工程问题

    在主界面一次选中 help gt about plugins 然后在弹出界面中找到QtCreator 在Designer右侧的的方框中打钩 然后close界面 重启软件 搞定 很简单的设置 浪费了好长时间
  • 芯片设计制造全过程

    芯片设计制造全过程 将一颗芯片从0到1 可以分为芯片设计和芯片制造两部分 芯片设计对应市场上一些fabless公司 这类公司只做芯片设计 而芯片制造对应的是foundary 比如国内的smic TSMC 国外的Samsung GlobalF
  • 分布式系统的接口幂等性设计

    什么是幂等性 就是用户对于同一操作发起的一次请求或者多次请求的结果是一致的 不会因为多次点击而产生了其他的结果 在 CRUD 这 4 个操作中 查询操作是天然幂等的 删除操作也只会删除一次 多次的删除操作结果还是一样 影响幂等的只有在添加和
  • 服务器考试系统推荐,如何挑选并发性好的在线考试系统?

    原标题 如何挑选并发性好的在线考试系统 并发性是在线考试系统的核心指标之一 不同的在线考试系统之间可能功能上看似差异不大 但并发性不同就会使得使用体验悬若霄壤 如何挑选并发性好的在线考试系统呢 最好的办法还是通过具体的使用来进行判断 什么是
  • ConstraintLayout 使用详解

    在安卓开发过程中除了一些列的逻辑代码程序以外 UI界面也是很重要的组成部分 对于用户来说界面更是一个应用的所有 所有的操作和交互都是在UI发生 对于开发者来说UI的加载和绘制对应用的计算和内存的影响更是不容忽视 下面看一组界面 这个布局很简
  • 线程池使用和自定义线程池

    目录 1 线程基础概述 1 1 线程池的作用 1 2 为什么要用线程池 1 3 比较重要的几个类 1 4 new Thread的弊端 2 四种线程池 2 1 源码分析 2 2 RejectedExecutionHandler 线程池四种拒绝
  • subversion强制写log的windows 和linux hooks脚本

    windows code echo offsetlocalset REPOS 1set TXN 2rem check that logmessage contains at least 10 characterssvnlook log RE
  • Tinyid原理介绍

    Id生成系统要点 在简单系统中 我们常常使用db的id自增方式来标识和保存数据 随着系统的复杂 数据的增多 分库分表成为了常见的方案 db自增已无法满足要求 这时候全局唯一的id生成系统就派上了用场 当然这只是id生成其中的一种应用场景 那
  • MYSQL 中的表空间

    MYSQL中的表空间 MYSQL 的表空间可以理解为其存储在物理磁盘上的 表名 ibd 文件 MYSQL 为了管理方便 增加了很多概念 来一一了解一下 逻辑概念 Segment 在 B 树的根页面的中 存储了两个 10 字节的字段 PAGE