数据库存储结构:页
索引结构给我们提供了高效的索引方式,不过索引信息以及数据记录都是保存在文件上的,确切的说时存储在页结构中
。另一方面,索引是在存储引擎中实现的,MySQL服务器上的 存储引擎
负责对表中数据的读取和写入工作。不同存储引擎中
存放的格式
一般是不同的,甚至 Memory引擎
都不用磁盘来存放。
磁盘与内存交互基本单位:页
InnoDB将数据划分位若干个页,InnoDB的大小默认为16kb
。
以 页
作为磁盘和内存之间交互的 基本单位
,也就是一次最少从磁盘中读取16KB的内容到内存中,一次最少把内存中的16KB内容刷新到磁盘中。也就是说,
在数据库中,无论读一行,还是多行,都是将这些行所在的页进行加载。也就是说,数据库 I/O操作的最小单位就是页
页结构概述
页与页之间 不在物理结构上相连
只需要通过双向链表
相关联即可。每个数据页中的记录会按照主键值从小到大组成 单向链表
。
单向链表
优势在于插入和删除操作速度快速,但查找却只能遍历,于是在页中还有 页目录
是一个数组这样就可以使用 二分法
快速找到数据。
页的上层结构
- 区
- 是比页大一级的存储结构,一个区会分配
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字节 | 校验页是否完整 |
第一部分 文件头和文件尾
文件头
作用:描述各种页的通用信息
文件尾
在文件尾中只有 FIL_PAGE_SPACE_OR_CHKSUM 和 FIL_PAGE_LSN
用于配合文件头校验 该页是否完整更新
第二部分 空闲空间、用户记录和最大最小记录
- 空闲空间
- 当我们每插入一条记录,都会从空闲空间中申请一个记录大小的空间划划分到用户记录部分。
- 用户记录
- 其中的记录按照指定的
行格式
存放,互相之间形成单链表
- 单链表形成与
行格式的记录头信息
有关
- 其中的记录按照指定的
- 最大最小记录
- 不是我们定义的,存放在一个叫做 Infimum + Supremum 的部分
第三部分 目录页、页面头部
- 目录页
- 记录是以
单向链表
的形式存储的,插入和删除
速度快。但检索效率不高
所以专门给记录做了一个目录,通过二分法查找提升效率。
- 记录是以
- 页面头部
- 得到一个数据页存储的记录的状态信息
快。但检索效率不高
所以专门给记录做了一个目录,通过二分法查找提升效率。
- 得到一个数据页存储的记录的状态信息
- 页面头部
- 得到一个数据页存储的记录的状态信息