mysql系列——底层存储结构(1)

本文深入探讨了MySQL InnoDB引擎的页结构,包括文件头、页头、最小最大记录、用户记录、空闲空间及页目录等关键部分,并解释了它们如何共同作用于数据存储与检索。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

INNODB引擎

1、表空间:表创建后,会生成两个文件,.frm和.ibd  (INNODB)

     frm:表结构定义文件

     ibd:表空间文件,存储数据和索引  

2、段(SEGMENT),多个区组成,相当于表

3、区(EXTENT),一个区由64页组成,大小也就是64x16k=1M

4、页(PAGE),也叫数据块,多个行记录组成,用户数据都存储在页中,每个页大小默认为16k,若一行数据就达到16k,那此页只有一条数据,若行数据大小16K,会将溢出数据存储到溢出页中,也就是所谓的页溢出off-page

 

 

Page页可划分下面几种结构

 

下面分别介绍一下page页中各个组成部分的含义。

  • File Header:文件头信息,比较重要的信息有FIL_PAGE_PREV记录上一个page页和FIL_PAGE_NEXT下一个page页的位置信息,通过这两个信息,可以让所有的page页面组成一个双向链表:
    在这里插入图片描述

    关于文件头File Header更为详细的内容参考如下图:
    在这里插入图片描述

  • Page Header:记录本页存储记录的状态信息,比如本页记录数量,槽数量,详细的信息参考下图:
    在这里插入图片描述

  • Infimun + Supermum Records:最小行与最大行记录,是虚拟记录,标记该page页中,存储的id最大的行和id最小的行记录。具体可以参考如下图的结构:
    在这里插入图片描述

  • User Records:用户真正的数据存储区域,这里真正存放用户的行数据,它占据了整个page页的大部分空间。以单链表的形式存储一条条行记录。如下图所示,他们在物理上不一定是有序的,可能刚开始是有序的,但是随着增删改的操作可能就无序了,但是在逻辑上是有序的:
    在这里插入图片描述

    一个page页中的多行记录,再结合多个page页,就形成如下的存储结构:页与页直接是双向链表,页内的行记录直接是单向链表。如下所示:page页中的每一个箭头可以理解为一行数据
    在这里插入图片描述

 

  • Free Space:存数据空间中尚未使用的区域,该页中剩余的空间,用于存放后续插入的数据。

  • Page Directory:页目录,页中某些记录的相对位置,用于提升查询效率。我们要在一个页中查找指定的一条记录。除了从头遍历还有更高效率的方法么?Page Directory提供了解决方案。

    InnoDB会将一个页中的所有记录划分成若干个组,每组4-8个记录。将每个组最后一个记录相对于第一个记录的地址偏移量(可以定位到真实数据记录,这里指的都是主键的值)提取出来存放在页中一个叫做Page Directory的数组中,数组中的元素就是这些地址偏移量,也称为槽(slot)。所以Page Directory就是由槽组成的。

    所以在一个页中根据主键查找记录是很快的,步骤为:

    1. 二分法确定该记录所在的槽,并找到该槽所在分组中主键值最小的那条记录。
    2. 通过next_record属性遍历单链表找到记录

    注意:二分法,适用于数组。

    链表是顺序存取,不是随机存取,用二分查找并不能提高查找效率,因为你每次还得从第一个结点出发,找到指针LOW,HIGH,MIDDLE所指的元素,所以一般不在链表内使用二分查找。

  • File Trailer:文件尾,刷盘时校验页是否完整。详细内参考下图:
    在这里插入图片描述

转发自:https://blog.youkuaiyun.com/javaanddonet/article/details/111992640

 

### MySQL 数据存储引擎 InnoDB 的底层文件和数据结构 #### 行记录格式 InnoDB 是一个支持事务安全的存储引擎,同时也是 MySQL 的默认存储引擎[^1]。当存储数据时,是以行为单位将数据存入数据库中,而 InnoDB 将这些数据按照行记录的方式存储在磁盘上[^2]。 #### 数据页 为了高效管理和访问大量数据,InnoDB 使用了固定大小的数据页作为基本存储单元。每个数据页通常包含多条行记录,并且每一页都有固定的大小(通常是 16KB)。这种设计使得内存管理更加简单有效,同时也减少了碎片化的影响。 #### B+ 树索引结构 对于大规模数据集来说,单个数据页显然不足以容纳所有的记录。为此,InnoDB 引入了基于 B+ 树的数据结构用于构建索引。B+ 树是一种平衡树形结构,其特点在于只有叶子节点保存实际的数据项,而非叶子节点则充当目录角色,帮助快速定位目标位置。这样的安排不仅提高了查询性能,还特别有利于执行范围扫描操作[^4]。 具体而言: - **内部节点**:仅包含键值及其对应的子节点指针; - **叶节点**:除了拥有键值外,还会携带完整的行记录信息以及指向下一个兄弟节点的链接,形成一条水平方向上的链表,从而简化了顺序读取过程[^5]。 #### 文件组织方式 整个数据库由若干个表空间组成,每个表空间对应着物理硬盘上的特定区域。其中最重要的是系统表空间(也称为共享表空间),它包含了诸如元数据字典在内的全局资源;除此之外还有独立于各个用户创建的具体业务表格所占用的空间——即所谓的“独占表空间”。无论是哪种类型的表空间,它们最终都会映射成操作系统层面的标准文件形式存在。 ```sql SHOW VARIABLES LIKE 'innodb_data_file_path'; ``` 上述命令可以查看当前实例配置下的 InnoDB 存储路径设置情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值