MySQL-InnoDB数据存储结构

news2024/11/24 8:44:55

1、存储结构-页

索引结构提供了高效的索引方式,索引信息以及数据记录都保存在数据文件或索引文件中(本质存储在页结构中)

1.1、磁盘与内存交互的基本单位:页

  • 在InnoDB中将数据划分为若干页,页的默认大小为:16KB
  • 不论读多少条数据,都是将这些数据所在的页进行加载。磁盘I/O操作最小单位是页。

1.2、页的结构

  • 相关数据页可以不在物理结构上相连,通过双向链表相关联。
  • 每个数据页中的数据记录会按照主键值的大小进行排序,组成一个单向链表
  • 每个数据页都会为存储的数据记录生成一个目录页,通过主键值查找是可以在目录页通过二分法快速定位相关数据记录

1.3、页的大小

  • 通过查找 innodb_page_size参数获取和设置
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| innodb_page_size | 16384 |
+------------------+-------+
1 row in set (2.89 sec)

1.4、页的上层结构

在这里插入图片描述

  • 区:是比页大一级的存储结构(默认1MB),在InnoDB存储结构中,一个区会分配64个连续的页
  • 段:由一个或多个区组成,区在文件系统是一个连续分配的空间,并不要求区和区之间是相邻的。段是数据库中的分配单位,不同类型的数据库对象以不同的段形式存在。创建表时会创建一个表段,创建索引时会创建一个索引段
  • 表空间:是一个逻辑容器,存储的对象是段,在一个表空间中可以有一个或者多个段,一个段只能属于一个表空间。数据库由一个或多个表空间组成,表空间从管理上可以划分为:系统表空间,用户表空间,撤销表空间,临时表空间等

2、页的内部结构

名称占用大小说明
文件头38字节描述页的信息
页面头部56字节页的状态信息
最大(小)用户26字节为两个虚拟的行记录
用户记录不确定存储行记录内容
空闲空间不确定页中还没有被使用的空间
页目录不确定存储用户记录的相对位置
文件尾8字节校验页是否完整

2.1、文件头(File Header)

  • 文件头存储了一些全局性的信息,如文件版本、页大小、文件ID等。
  • 文件头的大小通常是固定的,对于InnoDB的页,文件头大小是固定的38字节。
  • 文件头位于每个数据文件的开头,用于标识文件的类型和属性。
  • 主要划分为以下结构:
    • FIL_PAGE_SPACE_OR_CHKSUM(页的校验和):4字节,用于对页的内容进行校验,以确保数据完整性和防止损坏。

    • FIL_PAGE_OFFSET(页号):4字节,每个页都有一个唯一的页号,InnoDB通过页号可以定位到具体的页。

    • FIL_PAGE_PREV(上一个页的页号):4字节,指示上一个页的页号,保证了页之间的逻辑连续性。

    • FIL_PAGE_NEXT(下一个页的页号):4字节,指示下一个页的页号,同样保证了页之间的逻辑连续性。

    • FIL_PAGE_LSN(页面最后被修改的日志序列位置):8字节,记录了页面最后一次被修改时的日志序列位置(LSN)。

    • FIL_PAGE_TYPE(该页的类型):2字节,指示该页的类型,可能包括数据页、索引页等。

    • FIL_PAGE_FILE_FLUSH_LSN(独立表空间中都是0):8字节,用于记录独立表空间中的文件刷新LSN,对于非独立表空间该字段可能有其他用途。

    • FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID(页属于哪个表空间):4字节,用于指示页属于哪个表空间。

2.2、用户记录(User Records)

  • 实际存储在页中的数据和索引条目。
  • 这些记录按照B+树的结构组织在页中,叶子节点存储数据记录,非叶子节点存储索引记录。
  • 记录可以是固定长度或变长,根据存储的数据类型和大小而定。
  • 主要划分为以下结构:
    • delete_mask: 1字节, 标记该记录是否被删除,
      • 0 表示记录没有删除,
      • 1 表示记录被删除了
    • min_rec_mask :1字节, B+数的每非叶子节点中的最小纪录数都会添加该标记
      • 只有最小纪录数的min_rec_mask 值为1
      • 其他别的记录min_rec_mask 值为0
    • n_owned: 4字节,如果当前记录是组内最大记录,则代表槽内的记录数
    • heap_no :13字节 当前记录在本页中的位置信息
      • 最小记录的heap_no值:0
      • 最大记录的heap_no值:1
    • record_type: 3字节, 表示当前记录的类型
      • 0表示普通记录
      • 1表示B+树非叶子节点记录
      • 2表示最小记录
      • 3表示最大记录
    • next_record 16字节 表示从当前记录的真实数据到下一条记录的真实数据的地址偏移量。

2.3、最大(小)记录

  • 由5字节大小的记录投信息和8个字节大小的一个固定的部分组成
  • 本页中主键值最小的用户记录的下一条记录就是Infimum记录(也就是最小记录)
  • 本页中主键值最大的用户记录的下一条记录就是Supremum记录a(也就是最大记录)。

2.4、空闲空间(Free Space)

  • 空闲空间是页中未被使用的部分,用于存储新的数据和索引。
  • 当页中的自由空间不足时,InnoDB会进行页分裂操作,将页分成两个更小的页,以便腾出更多的空间。

2.5、页目录(Page Directory)

  • 页目录记录了页中数据和索引的偏移量及长度信息,以便InnoDB能够快速地定位和访问这些数据和索引。
  • 页目录是由多个槽(Slot)组成的数组,每个槽存储一个记录的偏移量和长度信息。
  • 页目录通常位于页头之后,占据了页的一部分空间
  • 所以在一个页中根据主键查找记录是很快的,步骤为两步:
    • 二分法确定该记录所在的槽,并找到该槽所在分组中主键值最小的那条记录。
    • 通过记录的 next_record 属性遍历该槽所在的组中的各个记录

2.6、页面头部(Page Header)

  • 记录数量(Number of Records):记录了本页中已经存储的记录数量。
  • 第一条记录的地址(Address of First Record):记录了本页中第一条记录的地址或偏移量,以便快速定位到第一条记录。
  • 页目录中槽的数量(Number of Slots in Page Directory):记录了页目录中存储的槽的数量,即页目录中有多少个条目。
  • 页目录起始地址(Address of Page Directory):记录了页目录的起始地址或偏移量,以便快速定位到页目录。
  • 其他状态信息(Other Status Information):可能还包括其他与页相关的状态信息,如空闲空间大小、最大记录偏移量等。
  • 通常包含以下信息:
名称占用空间大小描述
PAGE_N_DIR_SLOTS2字节页目录中的槽数量
PAGE_HEAP_TOP2字节还未使用的空间最小地址,该地址之后就是 Free Space
PAGE_N_HEAP2字节本页中的记录的数量(包括最大最小和标记为删除的记录)
PAGE_FREE2字节指向可重用空间的地址
PAGE_GARBAGE2字节已删除记录占用的字节数
PAGE_LAST_INSERT2字节最后插入记录的位置
PAGE_DIRECTION2字节最后插入的方向
PAGE_N_DIRECTION2字节一个方向连续插入的记录数量
PAGE_N_RECS2字节该页中记录的数量(不包括最大最小和标记为删除的记录)
PAGE_MAX_TRX_ID2字节修改当前页的最大事务ID,该值仅在二级索引中定义
PAGE_LEVEL2字节当前页在索引树(B+树)中的层级
PAGE_INDEX_ID8字节索引ID,表示当前页属于哪个索引
PAGE_BTR_SEG_LEAF10字节B+树叶子段的头部信息,仅在B+树的Root页定义
PAGE_BTR_SEG_TOP10字节B+树叶子段的头部信息,仅在B+树的Root页定义

2.7 文件尾(File Trailer)

  • 文件尾是文件的结束部分,通常用于存储一些结束标识或校验信息。
  • 文件尾的大小通常是固定的,对于InnoDB的数据文件,文件尾大小是8字节。
  • 通常划分为以下结构:
    • 前4个字节代表页的校验和,这个部分和 File Header 中的校验和相对应
    • 后4个字节代表页面被最后修改时对应的日志序列位置(LSN),这个部分也是为了校验页的完整性的,如果首部和尾部的LSN值校验不成功的话,就说明同步传输过程出现了问题。

3、行格式(记录格式)

3.1 查询InnoDB引擎的默认行格式

  • 语法如下:
mysql> show variables like 'innodb_default_row_format';
+---------------------------+---------+
| Variable_name             | Value   |
+---------------------------+---------+
| innodb_default_row_format | dynamic |
+---------------------------+---------+
1 row in set (0.13 sec)

  • 查看已创建表的行格式:
mysql> show table status like 'rqtanc_test'\G
*************************** 1. row ***************************
           Name: rqtanc_test
         Engine: InnoDB
        Version: 10
     Row_format: Dynamic
           Rows: 0
 Avg_row_length: 0
    Data_length: 16384
Max_data_length: 0
   Index_length: 0
      Data_free: 0
 Auto_increment: NULL
    Create_time: 2024-04-22 06:24:10
    Update_time: NULL
     Check_time: NULL
      Collation: utf8mb4_0900_ai_ci
       Checksum: NULL
 Create_options: 
        Comment: 
1 row in set (0.00 sec)

3.2、指定行格式

  • 创建表时指定行格式:
mysql> create table rqtanc_one(id int not null,col int null) row_format=compact;
  • 修改表时指定行格式:
mysql> alter table rqtanc_one row_format = dynamic;
Query OK, 0 rows affected (0.82 sec)

3.3、分类及相关相关详情描述

参考官方文档

4、表空间

参考 MySQL-数据目录

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

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

相关文章

SQLZOO:The JOIN operation

数据表:game-gaol-eteam game idmdatestadiumteam1team210018 June 2012National Stadium, WarsawPOLGRE10028 June 2012Stadion Miejski (Wroclaw)RUSCZE100312 June 2012Stadion Miejski (Wroclaw)GRECZE100412 June 2012National Stadium, WarsawPOLRUS... goal …

@游戏行业er!MongoDB广州线下沙龙邀您报名!

随着游戏和应用程序的发展,数据变得越来越重要。在为您的下一个游戏选择数据库时,数据库管理者常常会面对灵活性、可扩展性、可靠性、运营效率等问题或挑战。 MongoDB在游戏开发领域有着广泛的应用,灵活数据模型可以存储和处理各种类型的数据…

C++--String类

系列文章目录 文章目录 目录 系列文章目录 文章目录 前言 一、为什么要学习string 1.c语言的字符串 2.OJ上的使用 二、string类的接口介绍 1.string简介 2.string构造成员函数 3.operator函数 4.string容器size和length 5.重载operator[]和引用返回的意义 5.1 oper…

嫦娥六号揭秘真相:阿波罗登月是真是假?一文终结所有疑问!

近期,嫦娥六号的成功发射如同璀璨的星辰,再次将人们的视线聚焦于浩瀚的宇宙,与此同时,网络上关于美国阿波罗登月是否造假的争议也如潮水般涌现。一些声音宣称,嫦娥六号的发射为揭示美国阿波罗登月任务的真实性提供了关…

Java面试八股之String类的常用方法有哪些

Java中String类的常用方法有哪些 获取字符串信息: length():返回字符串的字符数。 isEmpty():判断字符串是否为空(即长度为0)。 访问单个字符: charAt(int index):返回指定索引处的字符。 …

InstantStyle —— 文本到图像生成中的风格保持新突破

在人工智能领域,文本到图像生成(Text-to-Image Generation)技术正迅速发展,其应用范围从娱乐到专业设计不断扩展。然而,风格一致性生成一直是该领域的一个技术难题。最近,InstantX团队提出了一种名为Instan…

GEVernova推出GEV新能源平台,引领新能源未来

近日,全球领先的能源设备制造和服务公司 GE Vernova 宣布推出 GEV 新能源平台,这是一个将金融、科技和产业深度融合的全新投资平台。GEV 新能源平台旨在为用户提供一站式可持续新能源投资解决方案,助力全球新能源转型和可持续发展。 新能源已…

vs-qt中无法加载qsqlite驱动,但是单独新建demo测试却又是正常的。。。

开发环境: Vs2015 + qt5.12 背景: 接手了一个项目,可以编译过去,也可以运行,, 但是登录一直失败,,但是数据库文件也是正常的。。。 最主要的是环境和同事的是一样的,,,但是他那边可以加载成功,我这边不可以。。 后来单独在vs中创建了一个demo,用来测试QSqlData…

如何高效管理微信?快速掌握捷径!

对于那些需要管理多个微信号的人来说,如何高效地管理这些账号成为了一个难题。今天,就给大家分享一个管理多个微信号的捷径——微信管理系统。 通过微信管理系统,你可以轻松实现高效管理多个微信号,一起来看看吧! 首…

一文汇总对比英伟达、AMD、英特尔显卡GPU

‍‍🏡博客主页: virobotics(仪酷智能):LabVIEW深度学习、人工智能博主 📑上期文章:『【仪酷LabVIEW AI工具包案例】使用LabVIEW AI工具包YOLOv5结合Dobot机械臂实现智能垃圾分类』 🍻本文由virobotics(仪酷…

C语言/数据结构——每日一题(环形链表)

一.前言 今天在力扣上刷到一道链表题——环形链表https://leetcode.cn/problems/linked-list-cycle 想着和大家们分享一下。让我们直接开始今天的分享吧。、 二.正文 1.1题目描述 1.2题目分析 这道题是想让我们做出分析,该链表是不是带环链表,如果是…

mac定时任务、自启动任务

https://quail.ink/mynotes/p/mac-startup-configuration-detailed-explanation <?xml version"1.0" encoding"UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.d…

DIFT:Emergent Correspondence from Image Diffusion # 论文阅读

URL https://arxiv.org/pdf/2306.03881 主页&#xff1a;https://diffusionfeatures.github.io/ 代码&#xff1a;https://github.com/Tsingularity/dift TD;DR 23 年 6月 cornell 大学的文章&#xff0c;任务是做图片的特征匹配&#xff08;关联&#xff09;&#xff0c;特…

Github入门10问,收藏~

Github是Python开发中最常用到的工具和资源&#xff0c;Github上Python相关的仓库多达300多万个&#xff0c;但有很多人还不知道怎么去使用Github&#xff0c;这里来通过10个问题来科普下。 什么是GitHub&#xff1f;为什么要学习使用GitHub&#xff1f;如何创建GitHub账户&…

VTK —— 三、标准格式 - 示例1 - 读取建模不同格式模型(支持.ply、.vtp、.obj、.stl、.vtk、.g等模型格式)(附完整源码)

代码效果 本代码编译运行均在如下链接文章生成的库执行成功&#xff0c;若无VTK库则请先参考如下链接编译vtk源码&#xff1a; VTK —— 一、Windows10下编译VTK源码&#xff0c;并用Vs2017代码测试&#xff08;附编译流程、附编译好的库、vtk测试源码&#xff09; 教程描述 本…

宝塔面板各种疑难杂症处理命令教程

下载地址&#xff1a;宝塔面板各种疑难杂症处理命令教程 这份宝塔面板各种疑难杂症处理命令教程&#xff0c;可以解决市面上遇到的各种难题&#xff0c;建议有技术能行的下载使用&#xff0c;小白也可以下载来学习可以帮助你解决宝塔面板遇到的各种难题

Java面试八股之什么是Java反射

什么是Java反射 基本概念 反射是Java语言的一个重要特性&#xff0c;它允许我们在运行时分析类、接口、字段、方法等组件的信息&#xff0c;并能够动态地操作这些组件&#xff0c;包括创建对象、调用方法、访问和修改字段值等。简单来说&#xff0c;反射提供了在程序运行时对…

镊子蜡烛如何抓住反转进行交易?昂首资本2步抓住反转

很多投资者通过之前的文章知道镊子烛台图&#xff0c;甚至可以通过镊子烛台图有多倍收益&#xff0c;但是很多投资者又迷惑了&#xff0c;为什么我没有通过镊子烛台图获得收益&#xff0c;甚至有时还会亏损收手。其实事情很容易理解&#xff0c;Anzo Capital昂首资本认为那是因…

MES管理系统在柔性制造中有何重要作用

在当今这个瞬息万变的商业环境中&#xff0c;制造业正经历着一场前所未有的转型。消费者需求的多样化和市场动态的快速变化要求企业必须具备高度的灵活性和适应性。为了应对这些挑战&#xff0c;柔性制造策略应运而生&#xff0c;它以其快速响应和灵活调整的能力&#xff0c;成…

WWW服务器搭建(2)——Apache服务器配置与管理

一、Apache简介 1.1 关于Apache Apache HTTP Server&#xff08;简称Apache&#xff09;是Apache软件基金会的一个开放源码的Web服务器&#xff0c;可以在大多数计算机操作系统中运行&#xff0c;由于其跨平台和安全性被广泛使用&#xff0c;是最流行的Web服务器端软件之一。…