文章目录

  • 数据库存储结构:页
  • 磁盘与内存交互基本单位:页
  • 页结构概述
  • 页的上层结构
  • 页的内部结构
  • 第一部分 文件头和文件尾
  • 文件头
  • 文件尾
  • 第二部分 空闲空间、用户记录和最大最小记录
  • 第三部分 目录页、页面头部


数据库存储结构:页

索引结构给我们提供了高效的索引方式,不过索引信息以及数据记录都是保存在文件上的,确切的说时存储在页结构中 。另一方面,索引是在存储引擎中实现的,MySQL服务器上的 存储引擎 负责对表中数据的读取和写入工作。不同存储引擎中
存放的格式 一般是不同的,甚至 Memory引擎都不用磁盘来存放。

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

InnoDB将数据划分位若干个页,InnoDB的大小默认为16kb

作为磁盘和内存之间交互的 基本单位 ,也就是一次最少从磁盘中读取16KB的内容到内存中,一次最少把内存中的16KB内容刷新到磁盘中。也就是说,
在数据库中,无论读一行,还是多行,都是将这些行所在的页进行加载。也就是说,数据库 I/O操作的最小单位就是页

mysql数据存储结构 mysql的数据存储结构_链表

页结构概述

页与页之间 不在物理结构上相连 只需要通过双向链表相关联即可。每个数据页中的记录会按照主键值从小到大组成 单向链表

单向链表优势在于插入和删除操作速度快速,但查找却只能遍历,于是在页中还有 页目录 是一个数组这样就可以使用 二分法快速找到数据。

页的上层结构

mysql数据存储结构 mysql的数据存储结构_表空间_02

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

页的内部结构

常见的页有 数据页(B+Tree的节点)系统页Undo页事务数据页等。

数据页的 16kb 被划分为7个部分。

名称

占用大小

说明

File Header 文件头

38字节

描述页的信息

Page Header 页头

56字节

页的状态信息

Infimum + Supremum 最大记录和最小记录

26字节

两个虚拟行记录

User Records 用户记录

不确定

存储行记录内容

Free Space 空闲记录

不确定

页中还没被使用的空间

Page Directory 页目录

不确定

存储用户记录的相对位置

File Trailer 文件尾

8字节

校验页是否完整

第一部分 文件头和文件尾

文件头

作用:描述各种页的通用信息

mysql数据存储结构 mysql的数据存储结构_数据库_03

文件尾

在文件尾中只有 FIL_PAGE_SPACE_OR_CHKSUM 和 FIL_PAGE_LSN

用于配合文件头校验 该页是否完整更新

第二部分 空闲空间、用户记录和最大最小记录

  • 空闲空间
  • 当我们每插入一条记录,都会从空闲空间中申请一个记录大小的空间划划分到用户记录部分。
  • 用户记录
  • 其中的记录按照指定的 行格式 存放,互相之间形成 单链表
  • 单链表形成与 行格式的记录头信息 有关
  • 最大最小记录
  • 不是我们定义的,存放在一个叫做 Infimum + Supremum 的部分

第三部分 目录页、页面头部

  • 目录页
  • 记录是以 单向链表的形式存储的,插入和删除速度快。但检索效率不高所以专门给记录做了一个目录,通过二分法查找提升效率。
  • 页面头部
  • 得到一个数据页存储的记录的状态信息
    快。但检索效率不高所以专门给记录做了一个目录,通过二分法查找提升效率。
  • 页面头部
  • 得到一个数据页存储的记录的状态信息