5.4 【MySQL】页目录

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介: 5.4 【MySQL】页目录

记录在页中按照主键值由小到大顺序串联成一个单链表,如果我们想根据主键值查找页中的某条记录,可以这样查询:

SELECT * FROM page_demo WHERE c1 = 3;

我们平常想从一本书中查找某个内容的时候,一般会先看目录,找到需要查找的内容对应的书的页码,然后到对应的页码查看内容。设计 InnoDB 的程序猿为我们的记录也制作了一个类似的目录,他们的制作过程是这样的:


1. 将所有正常的记录(包括最大和最小记录,不包括标记为已删除的记录)划分为几个组。


2. 每个组的最后一条记录(也就是组内最大的那条记录)的头信息中的 n_owned 属性表示该记录拥有多少条记录,也就是该组内共有几条记录。


3. 将每个组的最后一条记录的地址偏移量单独提取出来按顺序存储到靠近 页 的尾部的地方,这个地方就是所谓的 Page Directory ,也就是 页目录 (此时应该返回头看看页面各个部分的图)。页面目录中的这些地址偏移量被称为 槽 (英文名: Slot ),所以这个页面目录就是由 槽 组成的。


比方说现在的 page_demo 表中正常的记录共有6条, InnoDB 会把它们分成两组,第一组中只有一个最小记录,第二组中是剩余的5条记录,看下边的示意图:

从这个图中我们需要注意这么几点:


现在 页目录 部分中有两个槽,也就意味着我们的记录被分成了两个组, 槽1 中的值是 112 ,代表最大记录的地址偏移量(就是从页面的0字节开始数,数112个字节); 槽0 中的值是 99 ,代表最小记录的地址偏移量。


注意最小和最大记录的头信息中的 n_owned 属性


最小记录的 n_owned 值为 1 ,这就代表着以最小记录结尾的这个分组中只有 1 条记录,也就是最小记录本身。


最大记录的 n_owned 值为 5 ,这就代表着以最大记录结尾的这个分组中只有 5 条记录,包括最大记录本身还有我们自己插入的 4 条记录。


99 和 112 这样的地址偏移量很不直观,我们用箭头指向的方式替代数字,这样更易于我们理解,所以修改后的示意图就是这样:


对于最小记录所在的分组只能有 1 条记录,最大记录所在的分组拥有的记录条数只能在 1~8 条之间,剩下的分组中记录的条数范围只能在是 4~8 条之间。


在一个数据页中查找指定主键值的记录的过程分为两步:


1. 通过二分法确定该记录所在的槽,并找到该槽中主键值最小的那条记录。


2. 通过记录的 next_record 属性遍历该槽所在的组中的各个记录。


5.5 Page Header(页面头部)

在页中定义了一个叫Page Header的部分,它是页结构的第二部分,这个部分占用固定的56个字节,专门存储各种状态信息,具体如下:

名称

占用空间大小

描述

PAGE_N_DIR_SLOTS

2 字节

还未使用的空间最小地址,也就是说从该地址之后就是 Free Space

PAGE_HEAP_TOP

2 字节

还未使用的空间最小地址,也就是说从该地址之后就是 Free Space

PAGE_N_HEAP

2 字节

本页中的记录的数量(包括最小和最大记录以及标记为删除的记录)

PAGE_N_HEAP

2 字节

第一个已经标记为删除的记录地址(各个已删除的记录通过 next_record 也会组成一个单链表,这个单链表中的记录可以被重新利用)

PAGE_GARBAGE

2 字节

最后插入记录的位置

PAGE_LAST_INSERT

2 字节

最后插入记录的位置

PAGE_DIRECTION

2 字节

记录插入的方向

PAGE_N_DIRECTION

2 字节

一个方向连续插入的记录数量

PAGE_N_RECS

2 字节

该页中记录的数量(不包括最小和最大记录以及被标记为删除的记录)

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_DIRECTION


假如新插入的一条记录的主键值比上一条记录的主键值大,我们说这条记录的插入方向是右边,反之则是左边。用来表示最后一条记录插入方向的状态就是 PAGE_DIRECTION 。


PAGE_N_DIRECTION


假设连续几次插入新记录的方向都是一致的, InnoDB 会把沿着同一个方向插入记录的条数记下来,这个条数就用 PAGE_N_DIRECTION 这个状态表示。当然,如果最后一条记录的插入方向改变了的话,这个状态的值会被清零重新统计。


相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
9月前
|
存储 SQL 关系型数据库
[MySQL]学习笔记目录(尚硅谷宋红康MySQL数据库教程)
[MySQL]学习笔记目录(尚硅谷宋红康MySQL数据库教程)
|
9月前
|
SQL 关系型数据库 MySQL
【MySQL】初识MySQL以及bin目录命令总结(非常适合MySQL初学者学习)
【MySQL】初识MySQL以及bin目录命令总结(非常适合MySQL初学者学习)
227 0
|
10月前
|
数据可视化 前端开发 JavaScript
python+Django+Mysql+Echarts数据可视化实战教程(2):Django环境下web目录的配置
python+Django+Mysql+Echarts数据可视化实战教程(2):Django环境下web目录的配置
190 0
|
10月前
|
关系型数据库 MySQL 数据库
|
12月前
|
关系型数据库 MySQL
迁移mysql的data目录
通过apt-get或yum安装的mysql的目录通常的位置不时候存放大量的数据,我们很多时候需要把mysql的数据文件放在另外一个目录下,这个时候需要整体迁移,步骤如下:
105 0
|
存储 关系型数据库 MySQL
【Mysql】InnoDB 引擎中的页目录
【Mysql】InnoDB 引擎中的页目录
【Mysql】InnoDB 引擎中的页目录
|
关系型数据库 MySQL 数据库
安装mysql一站式详细操作【含解决没有data目录、查找初始密码(mysql5.7+)】
安装mysql一站式详细操作【含解决没有data目录、查找初始密码(mysql5.7+)】
安装mysql一站式详细操作【含解决没有data目录、查找初始密码(mysql5.7+)】
|
SQL 关系型数据库 MySQL
HIVE HDFS 同步到MYSQL里,在HIVE里存为目录的分区键的如何同步呢?
请教下 ,HIVE HDFS 同步到MYSQL的时候,如果在源端HIVE里是分区表,分区字段要这么同步到目标端MYSQL呢
141 1
HIVE HDFS 同步到MYSQL里,在HIVE里存为目录的分区键的如何同步呢?
|
存储 关系型数据库 MySQL
Docker的Mysql数据库:把数据存储在本地目录
Docker mysql 把数据存储在本地目录,很简单,只需要映射本地目录到容器即可
809 0
|
关系型数据库 MySQL Linux