mysql中数据页的相关概念

您所在的位置:网站首页 内存单位的大小 mysql中数据页的相关概念

mysql中数据页的相关概念

2023-12-11 01:12| 来源: 网络整理| 查看: 265

参考:https://www.phpmianshi.com/?id=136

概念

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

 

 

数据页

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

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

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

 

 

 

 

名称中文名占用空间大小简单描述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_SLOTS2字节在页目录中的槽数量PAGE_HEAP_TOP2字节还未使用的空间最小地址,也就是说从该地址之后就是Free SpacePAGE_N_HEAP2字节本页中的记录的数量(包括最小和最大记录以及标记为删除的记录)PAGE_FREE2字节第一个已经标记为删除的记录地址(各个已删除的记录通过next_record也会组成一个单链表,这个单链表中的记录可以被重新利用)PAGE_GARBAGE2字节已删除记录占用的字节数PAGE_LAST_INSERT2字节最后插入记录的位置PAGE_DIRECTION2字节记录插入的方向PAGE_N_DIRECTION2字节一个方向连续插入的记录数量PAGE_N_RECS2字节该页中记录的数量(不包括最小和最大记录以及被标记为删除的记录)PAGE_MAX_TRX_ID8字节修改当前页的最大事务ID,该值仅在二级索引中定义PAGE_LEVEL2字节当前页在B+树中所处的层级PAGE_INDEX_ID8字节索引ID,表示当前页属于哪个索引PAGE_BTR_SEG_LEAF10字节B+树叶子段的头部信息,仅在B+树的Root页定义PAGE_BTR_SEG_TOP10字节B+树非叶子段的头部信息,仅在B+树的Root页定义

1.PAGE_GARBAGE

在页面空间不够时,会尝试将所需空间与这个值比较,如果够,那么将记录移到临时表中,再重新插回来(记录逐条新增是不会产生碎片空间的),但很明显,这很耗性能

PAGE_BTR_SEG_LEAF 和 PAGE_BTR_SEG_TOP

后面会说到段的概念,一个索引会有两个段,一个叶子节点段,一个非叶子节点段,这两个属性分别代表一个 Segment Header,代表了哪个表空间哪个页面的哪个INODE Entry (表空间号 + 页面号 + 偏移量值)

File Header

名称占用空间大小描述FIL_PAGE_SPACE_OR_CHKSUM4字节页的校验和(checksum值)FIL_PAGE_OFFSET4字节页号FIL_PAGE_PREV4字节上一个页的页号FIL_PAGE_NEXT4字节下一个页的页号FIL_PAGE_LSN8字节页面被最后修改时对应的日志序列位置(英文名是:Log Sequence Number)FIL_PAGE_TYPE2字节该页的类型FIL_PAGE_FILE_FLUSH_LSN8字节仅在系统表空间的一个页中定义,代表文件至少被刷新到了对应的LSN值FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID4字节页属于哪个表空间

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

FIL_PAGE_OFFSET

每个表空间的页号唯一,四个字节足够用了

FIL_PAGE_PREV 和 FIL_PAGE_NEXT

上一页和下一页,诶哟,这不是双向链表啊,那所有的页加起来组成了一个双向链表哇,好玩吧~

FIL_PAGE_TYPE

类型名称十六进制描述FIL_PAGE_TYPE_ALLOCATED0x0000最新分配,还没使用FIL_PAGE_UNDO_LOG0x0002Undo日志页FIL_PAGE_INODE0x0003段信息节点FIL_PAGE_IBUF_FREE_LIST0x0004Insert Buffer空闲列表FIL_PAGE_IBUF_BITMAP0x0005Insert Buffer位图FIL_PAGE_TYPE_SYS0x0006系统页FIL_PAGE_TYPE_TRX_SYS0x0007事务系统数据FIL_PAGE_TYPE_FSP_HDR0x0008表空间头部信息FIL_PAGE_TYPE_XDES0x0009扩展描述页FIL_PAGE_TYPE_BLOB0x000ABLOB页FIL_PAGE_INDEX0x45BF索引页,也就是我们所说的数据页

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

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

假设一条查询语句定位到了这个页面

先将条件中的列(加深为col)与值(假设为x)拎出来,二分法定位在哪个组。

假设10个槽,(0 + 9)/2 = 4, 将第四个槽的条件列的值拿出来跟x比较,如果x大,那就从5~9的槽中继续二分找;如果x小, 那就从0~4的槽中继续二分;

直到前后两个槽相差为1,那记录就在那个大的槽里面,又每个槽其实存的是组内最大记录,那前一个槽对应记录的下一个节点就是目标槽对应组中的最小值,顺着单链表往后一个一个比就完事了,每组最多八条记录,这速度还是很快的。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3