| |
|
开发:
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位组成
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进入磁盘写入时,会先将数据写到内存的双写缓冲区。
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |