IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> InnoDB 引擎底层存储和缓存原理 -> 正文阅读

[数据结构与算法]InnoDB 引擎底层存储和缓存原理

InnoDB 记录存储结构和索引页结构

? mysql与磁盘交互的基本单位是页,一页默认是16KB。一次最少从磁盘中读取 16KB 的内容到内存中,一次最少把内存中的 16KB 内容刷新到磁盘中。

行格式

Compact:在记录 的真实数据处只会存储该列的该列的前 768 个字节的数据,然后把剩余的数据分 散存储在几个其他的页中,记录的真实数据处用 20 个字节存储指向这些页的地址。
Dynamic: mysql5.7默认的行格式。不会在记录的真实数据处存储字段真实数据的前 768 个字节,而是把所有的字节都存储到其他页面中,只在记录的真实数据处存储其他页面的地址。
Compressed 处理溢出页与 Dynamic一致。但采用压缩算法对页面进行压 缩,以节省空间。

? ?mysql数据行除了记录表中定义的数据列外还有很多额外的字段列:

变长字段长度列表:比如VARCHAR(M)VARBINARY(M)、 各种 TEXT 类型,各种 BLOB 类型,他们的长度是不固定的,所以我们在存储真实数据 的时候需要顺便把这些数据占用的字节数也存起来。如果该可变字段允许存储的 最大字节数超过 255 字节并且真实存储的字节数超过 127 字节,则使用 2 个字节, 否则使用 1 个字节。

Null值列表:表中的某些列可能存储 NULL 值,mysql用一个二进制列表来当前记录的列数据是否为null,如果列表值为0,代表是null,如果是1,代表不为null。

记录头:由8个字节共40位组成

列名位数作用
预留位11暂未使用
预留位21暂未使用
delete_mark1标记该记录是否被删除。当页面被删除时将值标记为日1,
min_rec_mask1非叶子节点中的最小记录会添加该标记
n_owened4每个槽内最大的记录才有值,表示当前所在槽拥有的记录行数。
heap_no13表示当前记录在页的位置信息,最小和最大的两条伪记录的编号分别时0和1.
record_type
3
表示当前记录的类型, 0 表示普通记录, 1 表示 B+ 树非叶子 节点记录,2 表示最小记录, 3 表示最大记录
next_record
16
表示下一条记录的相对位置。每个页面的所有记录组成一个从最小到最大的单向链表。
DB_ROW_ID(row_id) 非必须, 6 字节,表示行 ID ,唯一标识一条记录
DB_TRX_ID 必须, 6 字节,表示事务 ID
DB_ROLL_PTR 必须, 7 字节,表示回滚指针

索引页格式

?一个 InnoDB 数据页的存储空间大致被划分成了 7 个部分:

File Header: 文件头部 38 字节 页的一些通用信息,如当前页编号,上一页、下一页的地址。页的校验信息等。
Page Header:? 页面头部 56 字节 数据页专有的一些信息,如本页由多少记录,有多少个槽,第一条记录的地址等。
Infimum + Supremum: 最小记录和最大记录 26 字节 它时页面中虚拟出来的两条的行记录。
User Records: 用户记录 大小不确定 实际存储的行记录内容。
Free Space:?空闲空间 大小不确定 页中尚未使用的空间。当页面插入新记录时,都会从 Free Space 部分申请一个记录大小的空间划分到 User Records 部分。
Page Directory: 页面目录 大小不确定 页中的某些记录的相对位置。它是一个跳表。mysql将页面中的记录按顺序分为若干个组,第一个组一条记录,中间组4-8个记录。最后一个组1-8条记录。这些组的最大记录的地址偏移量称为槽。page dictory就是由槽构成的一个树结构。mysql查找数据时先通过page dictory二分查找定位到数据可能所在的槽,再根据槽找到对应的分组,顺序遍历分组链表里的记录,最终查询结果是否存在。
File Trailer: 文件尾部 8 字节 校验页是否完整。前 4 个字节代表页的校验和,与File Header 中的校验和相对应的。后 4 个字节代表页面被最后修改时对应的日志序列位置(LSN),这个也和校
验页的完整性有关。

InnoDB 的体系结构

? ?MySQL的记录存储在页中,连续的64个页组成了一个区,也就是1MB大小。每256个区称为一个组,第一个组最开始的 3 个页面的类型是固定的:用来登记整个表空间的一些整 体属性以及本组所有的区被称为 FSP_HDR,也就是 extent 0 ~ extent 255 256 个区,整个表空间只有一个 FSP_HDR。为了区分叶子节点和非叶子节点页面,所有的非叶子节点和叶子节点分别组成一个集合,称为段,即一个索引有两个段。

系统表空间
? MYSQL有且仅有一张系统表,表ID为0,系统表extent 1 和 extent 两个区,也就是页号从 64~191 这 128 个页面被称为 Doublewrite buffer,也就是双写缓冲区。
双写缓冲区 / 双写机制
双写缓冲区 / 双写机制是 InnoDB 的三大特性之一,还有两个是 Buffer Pool 、自
适应 Hash 索引。mysql1页是16KB,而操作系统一页是4KB。也就是说mysql写一页数据操作系统需要写4次才能完成,如果这过程中出现了中断,那么MYSQL就会产生脏页。这种脏页无法通过redo日志恢复,因此引入了双写缓存机制(doublewrite buffer )。mysql进入磁盘写入时,会先将数据写到内存的双写缓冲区。

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-05-08 08:20:57  更:2022-05-08 08:21:10 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 3:54:17-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码