首页 > 数据库 >mysql中数据页的相关概念

mysql中数据页的相关概念

时间:2022-11-21 13:35:40浏览次数:44  
标签:字节 记录 概念 mysql 空间 相关 TYPE PAGE FIL


概念

在 InnoDB 存储引擎中,所有的数据都被逻辑地存放在表空间中,表空间(tablespace)是存储引擎中最高的存储逻辑单位,在表空间的下面又包括段(segment)、区(extent)、页(page),他们之间的关系如下:

 

mysql中数据页的相关概念_链表

 

数据页

页是mysql中磁盘和内存交换的基本单位,也是mysql管理存储空间的基本单位。

同一个数据库实例的所有表空间都有相同的页大小;默认情况下,表空间中的页大小都为 16KB,当然也可以通过改变 innodb_page_size 选项对默认大小进行修改,需要注意的是不同的页大小最终也会导致区大小的不同。

一次最少从磁盘读取16KB内容到内存中,一次最少把内存中16KB内容刷新到磁盘中,当然了单页读取代价也是蛮高的,一般都会进行预读

 

mysql中数据页的相关概念_数据_02

 

 

 

名称

中文名

占用空间大小

简单描述

​File Header​

文件头部

38字节

页的一些通用信息

​Page Header​

页面头部

56字节

数据页专有的一些信息

​Infimum​​​ + ​​Supremum​

最小记录和最大记录

26字节

两个虚拟的行记录

​User Records​

用户记录

不确定

实际存储的行记录内容

​Free Space​

空闲空间

不确定

页中尚未使用的空间

​Page Directory​

页面目录

不确定

页中的某些记录的相对位置

​File Trailer​

文件尾部

8字节

校验页是否完整

 

 

Infimum + Supremum

 

  • 这个值位于整个页面的第三部分
  • 分别是最小记录和最大记录,属于MySQL为每个页添加的​​虚拟记录​
  • 由五个字节的​​记录头​​ 和 八个字节的 值(分别是单词​​Infimum​​和​​Supremum​​)组成
  • 最小记录的记录头中​​heap_no​​为0
  • 最大记录的记录头中​​heap_no​​为1
  • 也就是说正式记录中的​​heap_no​​属性从2开始
  • 最小记录的record_type 是2
  • 最大记录的record_type 是3
  • 最小记录是页中单链表的头结点
  • 最大记录是页中单链表的尾结点

​Page Directory​

  • 这个页目录里面存的是一个一个的槽(​​slot​​)
  • 每个槽指向组内最大记录的地址偏移量(我理解为页内偏移量)
  • 这个数据结构是数组,按主键值从小到大排列
  • 这种结构注定了查询最快的方式是二分法,时间复杂度O(lgN)
  • ​页分裂​​(前面说过) 时会增加一个槽

​User Records​​​ 和 ​​Free Space​

  • 完全空闲的页是没有 ​​User Records​​部分的
  • 插入数据时,从​​Free Space​​分配空间给​​User Records​​,直到​​Free Space​​没有空间或空间不够分配新的记录,这时需要申请新的页

​Page Header​

名称

占用空间大小

描述

​PAGE_N_DIR_SLOTS​

2字节

在页目录中的槽数量

​PAGE_HEAP_TOP​

2字节

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

​PAGE_N_HEAP​

2字节

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

​PAGE_FREE​

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页定义

1.​​PAGE_GARBAGE​

  • 在页面空间不够时,会尝试将所需空间与这个值比较,如果够,那么将记录移到临时表中,再重新插回来(记录逐条新增是不会产生碎片空间的),但很明显,这很耗性能
  1. ​PAGE_BTR_SEG_LEAF​​​ 和 ​​PAGE_BTR_SEG_TOP​
  • 后面会说到段的概念,一个索引会有两个段,一个叶子节点段,一个非叶子节点段,这两个属性分别代表一个 ​​Segment Header​​,代表了哪个表空间哪个页面的哪个​​INODE Entry​​ (表空间号 + 页面号 + 偏移量值)

​File Header​

名称

占用空间大小

描述

​FIL_PAGE_SPACE_OR_CHKSUM​

4字节

页的校验和(checksum值)

​FIL_PAGE_OFFSET​

4字节

页号

​FIL_PAGE_PREV​

4字节

上一个页的页号

​FIL_PAGE_NEXT​

4字节

下一个页的页号

​FIL_PAGE_LSN​

8字节

页面被最后修改时对应的日志序列位置(英文名是:Log Sequence Number)

​FIL_PAGE_TYPE​

2字节

该页的类型

​FIL_PAGE_FILE_FLUSH_LSN​

8字节

仅在系统表空间的一个页中定义,代表文件至少被刷新到了对应的LSN值

​FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID​

4字节

页属于哪个表空间

这个属性里面的值就说三个:

  • ​FIL_PAGE_OFFSET​
  1. 每个表空间的页号唯一,四个字节足够用了
  • ​FIL_PAGE_PREV​​​ 和 ​​FIL_PAGE_NEXT​
  1. 上一页和下一页,诶哟,这不是双向链表啊,那所有的页加起来组成了一个双向链表哇,好玩吧~
  • ​FIL_PAGE_TYPE​

类型名称

十六进制

描述

​FIL_PAGE_TYPE_ALLOCATED​

0x0000

最新分配,还没使用

​FIL_PAGE_UNDO_LOG​

0x0002

Undo日志页

​FIL_PAGE_INODE​

0x0003

段信息节点

​FIL_PAGE_IBUF_FREE_LIST​

0x0004

Insert Buffer空闲列表

​FIL_PAGE_IBUF_BITMAP​

0x0005

Insert Buffer位图

​FIL_PAGE_TYPE_SYS​

0x0006

系统页

​FIL_PAGE_TYPE_TRX_SYS​

0x0007

事务系统数据

​FIL_PAGE_TYPE_FSP_HDR​

0x0008

表空间头部信息

​FIL_PAGE_TYPE_XDES​

0x0009

扩展描述页

​FIL_PAGE_TYPE_BLOB​

0x000A

BLOB页

​FIL_PAGE_INDEX​

0x45BF

索引页,也就是我们所说的数据页

现在只需要看这最后一个索引页,又称数据页(跟​​InnoDB​​的特性有关)

属性介绍了一堆,还是不知道怎么查,举个栗子

  • 假设一条查询语句定位到了这个页面
  • 先将条件中的列(加深为​​col​​)与值(假设为​​x​​)拎出来,二分法定位在哪个组。
  1. 假设10个槽,(0 + 9)/2 = 4, 将第四个槽的条件列的值拿出来跟​​x​​比较,如果​​x​​大,那就从5~9的槽中继续二分找;如果​​x​​小, 那就从0~4的槽中继续二分;
  2. 直到前后两个槽相差为1,那记录就在那个大的槽里面,又每个槽其实存的是组内最大记录,那前一个槽对应记录的下一个节点就是目标槽对应组中的最小值,顺着单链表往后一个一个比就完事了,每组最多八条记录,这速度还是很快的。

标签:字节,记录,概念,mysql,空间,相关,TYPE,PAGE,FIL
From: https://blog.51cto.com/u_6353447/5873667

相关文章

  • mysql中eq_range_index_dive_limit参数学习
    ​概念官方文档如下描述:Thisvariableindicatesthenumberofequalityrangesinanequalitycomparisonconditionwhentheoptimizershouldswitchfromusingind......
  • Laravel中的基本概念
    一.什么是DI依赖注入/IOC控制反转DI依赖注入啥都不说,直接上代码<?phpclassUserController{private$user;function__construct(UserModel$u......
  • mysql中AnalyzeTable优化
    AnalyzeTableMySQL的Optimizer(优化元件)在优化SQL语句时,首先需要收集一些相关信息,其中就包括表的cardinality(可以翻译为“散列程度”),它表示某个索引对应的列包含多少个不同......
  • mysql中explain分析sql详解
     Explain举例mysql> explain select * from event; +—-+————-+——-+——+—————+——+———+——+——+——-+ | id | select_type | table | ......
  • mysql中优化器是如何选择索引的
    ​一:概念-在索引建立之后,一条语句可能会命中多个索引,这时,索引的选择,就会交由 优化器来选择合适的索引。- 优化器选择索引的目的,是找到一个最优的执行方案,并用......
  • 盘点MySQL的八大日志,你知道哪些?
    前言日志对于任何系统应用来说都承载着至关重要的作用,借助日志,我们可以发现系统运行错误的原因,从而解决问题。MySQL也不例外,也会记录各种各样的日志信息。那么你知道MySQL都......
  • mysql中performance_schema(一)配置篇
    背景   performance_schema最早在MYSQL5.5中出现,而现在5.6,5.7中performance_schema又添加了更多的监控项,统计信息也更丰富,真乃DBA童鞋进行性能诊断分析的福音。 检查......
  • mysql常见面试题第一讲
    ​一、为什么用自增列作为主键1、如果我们定义了主键(PRIMARYKEY),那么InnoDB会选择主键作为聚集索引。如果没有显式定义主键,则InnoDB会选择第一个不包含有NULL值的唯一索引......
  • mysql中performance_schema(三) 实践篇
     背景前一篇文章我们分析了performance_schema中每个表的用途,以及主要字段的含义,比较侧重于理论的介绍。这篇文章我主要从DBA的角度出发,详细介绍如何通过performance_schem......
  • mysql中CPU或内存利用率过高问题
    CPU利用率过高原因在MySQL使用过程中,出现CPU利用率过高甚至超过100%时,与数据库存在低效SQL或大量行锁冲突有非常大的关系,一般都是由于大量低效的SQL导致,出现行锁冲......