InnoDB(7)数据持久化 --mysql从入门到精通(十二)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: InnoDB(7)数据持久化 --mysql从入门到精通(十二)

上篇文章我们说了,索引页分为7个部分,其中free space会给user recoreds分配空间存储真实数据,直到用完申请新的页。查询拥有page directory,会分成不同的槽点,最小槽点有一个值,最大槽点有1~8个值,查询的时候用二分查找法定位id的槽点,然后遍历当前槽点就好。

InnoDB(6)索引页select --mysql从入门到精通(十一)


Page Header(页面头部)


pageHeader就是记录了数据页存放的信息,比如本页已经存储多少数据,第一条记录的地址是什么,页里多少个槽点。所以特意第一位page Header,他是页的第二部分,固定了56个字节,专门存储各种状态,下面看看他各个部分是干嘛的:

page_n_dir_slots:占用2个字节,页中槽点数量。

page_heap_top:占用2个字节,还未使用的空间最小地址,也就是说改地址之后就是free space。

page_n_heap:占用2个字节,本页中的记录数量(包括最小记录,最大记录和删除的记录)。

page_free:占用2个字节,第一个被标记删除的地址值(以后各个被删除的数据会组成一个单链表,这个单链表的地址值可以重新利用)。

page_garbage:占用2个字节,已删除记录占用字节。

page_last_insert:占用2个字节,最后插入记录位子。

page_direction:占用两个字节,记录插入方向。

page_n_direction:占用两个字节,一个方向连续插入记录数量。

page_n_recs:占用两个字节,该页中记录的数量(不包括最大记录最小记录和删除的数据)。

page_max_trx_id:占用8个字节,修改当前页最大事务id,改值仅在二级索引 中定义。

page_level:占用2个字节,当前页在b+树中所处的层级。

page_index_id:占用8个字节,索引id,表示当前页属于哪个索引。

page_btr_seg_leaf:占用10个字节,b+树叶子段的头部信息,仅在b+树的root页定义。

page_btr_seg_top:占用10个字节,b+树非叶子段的头部信息,仅在b+树的root页定义。

如果看过前面我的文章,相信大家对page_n_dir_slots,page_last_insert,page_n_recs不陌生了,如果不了解,请先看看前面的文章。其他的不了解暂时没事,后面我们可以慢慢熟悉。

Page_direction:表示最后一条记录插入的方向状态,若比上一条记录主键大,插入方向在右边,若比上一条记录小,插入方向在左边。

Page_n_direction:加入插入几次方向都是一致的,innoDB会沿着同一方向记录下来,如果最后一条记录方向改变,则会吧page_n_direction清零。


File header(文件头部)


上面说了page header是记录页,比如 多少槽,多少记录等。现在file header针对不同类型的页通用,也就是说不同类型的页都以file header作为第一个组成部分,秒速各页通用信息,比如页的编码,他的上一页下一页,占用38个字节。

File_page_space_or_chksum:代表当前页的效验和和cheacksum,啥是效验和?对于一个很长很长的字符串,我们会通过计算用较短的值来代表这个很长的字符串,这就叫效验和。这样比较两个很长字符串直接比较他们效验和就好,提高效率。

File_page_offset:每个页都有唯一性,这就是定位页的唯一性。

File_page_type:代表当前页的类型,innoDB会为了不同的目的吧页分为不同的类型,我们之前介绍过数据页,也就是索引页(file_page_index)。

File_page_prev和file_page_next:因为innoDB不可能用非常大的存储空间存储大量的数据,所以就把数据分到不同的页,为了吧这些不连续的页关联起来,通过file_page_prev和file_page_next组成的双向链表,但不是所有类型的页都有这两个属性,我们介绍的索引页是有的。


File Trailer


我们知道file header里有效验和,而尾部的trailer也有效验和。innoDB会把数据刷新到磁盘上,但因为读写磁盘效率太慢,所以通过页为单位刷新到磁盘。但如果同步了了一半断点怎么办?就是通过trailer的效验和来解决,file trailer有8个字节组成:

前四个字节代表效验和:当吧页数据同步到磁盘时候,先会把file header的效验和计算出来,同步到磁盘上,当数据全部同步成功,则吧头部的效验计算给尾部trailer,最后验证这两个效验和是否一致,则同步成功。反之刷新到磁盘一半,断点则会失败。

后四个字节代表最后修改时对应的日志序列位置(LSN):这部分也是为了效验文件完整性,后面详细介绍LSN。

File header 和 file trailer是所有类型页的通用页。


总结:


innoDB表为了设计会有不同的页,我们存储数据的页叫索引页:

file header:存储效验和,页的唯一性,页的类型,及其file_page_prev和file_page_next来组成双向链表,吧不同的页关联起来。

page header:主要存储页的槽点,和记录值等,每个头部信息都有next record属性,从而使页里的数据串联成一个单链表。

infimum+supremum:两个虚拟记录,分别记录最小值和最大值,在页的头部信息。

user recoreds:存储真实数据 的地址,内存从free space申请。

free space:分配内存给user recoreds。

page directory:页目录,查询一条数据,不可能从页的第一条数据循环到最后一条,他每个页分为多个槽点,槽0放最小记录,一条数据,最大记录放1~8条数据,其他的放4~8条数据,添加数据过程,每次放入最大记录槽点,当放入第九个时候,则会多分一个槽点,槽0一条数据,槽1有4条数据,槽2最大数据和5条数据。查询的时候用二分查找法,找到对应的槽,从最小索引依次查找。

file trailer:存储效验和,刷新纪录到磁盘时,先计算file header信息效验和的lsn值到磁盘,当全部数据刷新到磁盘后,在修改trailer的效验和lsn值,最后比较两个lsn值是否一致,一致数据持久化成功。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
5天前
|
存储 Oracle 关系型数据库
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
本文介绍了MySQL InnoDB存储引擎中的数据文件和重做日志文件。数据文件包括`.ibd`和`ibdata`文件,用于存放InnoDB数据和索引。重做日志文件(redo log)确保数据的可靠性和事务的持久性,其大小和路径可由相关参数配置。文章还提供了视频讲解和示例代码。
107 11
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
|
5天前
|
缓存 NoSQL 关系型数据库
Redis和Mysql如何保证数据⼀致?
在项目中,为了解决Redis与Mysql的数据一致性问题,我们采用了多种策略:对于低一致性要求的数据,不做特别处理;时效性数据通过设置缓存过期时间来减少不一致风险;高一致性但时效性要求不高的数据,利用MQ异步同步确保最终一致性;而对一致性和时效性都有高要求的数据,则采用分布式事务(如Seata TCC模式)来保障。
35 14
|
5天前
|
存储 Oracle 关系型数据库
【赵渝强老师】MySQL InnoDB的表空间
InnoDB是MySQL默认的存储引擎,主要由存储结构、内存结构和线程结构组成。其存储结构分为逻辑和物理两部分,逻辑存储结构包括表空间、段、区和页。表空间是InnoDB逻辑结构的最高层,所有数据都存放在其中。默认情况下,InnoDB有一个共享表空间ibdata1,用于存放撤销信息、系统事务信息等。启用参数`innodb_file_per_table`后,每张表的数据可以单独存放在一个表空间内,但撤销信息等仍存放在共享表空间中。
|
8天前
|
SQL 前端开发 关系型数据库
SpringBoot使用mysql查询昨天、今天、过去一周、过去半年、过去一年数据
SpringBoot使用mysql查询昨天、今天、过去一周、过去半年、过去一年数据
37 9
|
5天前
|
存储 Oracle 关系型数据库
【赵渝强老师】MySQL InnoDB的段、区和页
MySQL的InnoDB存储引擎逻辑存储结构与Oracle相似,包括表空间、段、区和页。表空间由段和页组成,段包括数据段、索引段等。区是1MB的连续空间,页是16KB的最小物理存储单位。InnoDB是面向行的存储引擎,每个页最多可存放7992行记录。
|
6天前
|
存储 Oracle 关系型数据库
【赵渝强老师】MySQL的InnoDB存储引擎
InnoDB是MySQL的默认存储引擎,广泛应用于互联网公司。它支持事务、行级锁、外键和高效处理大量数据。InnoDB的主要特性包括解决不可重复读和幻读问题、高并发度、B+树索引等。其存储结构分为逻辑和物理两部分,内存结构类似Oracle的SGA和PGA,线程结构包括主线程、I/O线程和其他辅助线程。
【赵渝强老师】MySQL的InnoDB存储引擎
|
16天前
|
SQL 关系型数据库 MySQL
定时任务频繁插入数据导致锁表问题 -> 查询mysql进程
定时任务频繁插入数据导致锁表问题 -> 查询mysql进程
36 1
|
18天前
|
SQL 关系型数据库 MySQL
mysql数据误删后的数据回滚
【11月更文挑战第1天】本文介绍了四种恢复误删数据的方法:1. 使用事务回滚,通过 `pymysql` 库在 Python 中实现;2. 使用备份恢复,通过 `mysqldump` 命令备份和恢复数据;3. 使用二进制日志恢复,通过 `mysqlbinlog` 工具恢复特定位置的事件;4. 使用延迟复制从副本恢复,通过停止和重启从库复制来恢复数据。每种方法都有详细的步骤和示例代码。
|
7天前
|
SQL 关系型数据库 MySQL
go语言数据库中mysql驱动安装
【11月更文挑战第2天】
20 4
|
5天前
|
SQL 关系型数据库 MySQL
12 PHP配置数据库MySQL
路老师分享了PHP操作MySQL数据库的方法,包括安装并连接MySQL服务器、选择数据库、执行SQL语句(如插入、更新、删除和查询),以及将结果集返回到数组。通过具体示例代码,详细介绍了每一步的操作流程,帮助读者快速入门PHP与MySQL的交互。
14 1