INNODB 数据页结构
|
InnoDB 16384B 16K |
38B |
FILE |
|
56B |
PAGE |
|
|
RECORD |
Infimum |
|
|
UserRecords |
||
|
Free |
||
|
Page |
||
|
8B |
File |
|
FILE HEADER 占用38个字节 |
||
|
名称 |
大小 |
|
|
FIL_PAGE_SPACE_OR_CHECKSUM |
4 |
保证页的可靠与完整的CHECKSUM校验码 |
|
FIL_PAGE_OFFSET |
4 |
表空间中页的偏移值 |
|
FIL_PAGE_PREV |
4 |
当前页的上一下的地址 |
|
FIL_PAGE_NEXT |
4 |
当前页的上一下的地址 |
|
FIL_PAGE_LSN |
8 |
该页最后被修改的日志LSN号 |
|
FIL_PAGE_TYPE |
2 |
页的类型 |
|
FIL_PAGE_FILE_FLUSH_LSN |
8 |
该值仅在数据文件的一个页中进行定义,代表已经被更新到了该LSN |
|
FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID |
4 |
MYSQL4.1开始,代表页属于哪个表空间 |
|
INNODB Page类型 |
||
|
名称 |
十六进制 |
解释 |
|
FIL_PAGE_INDEX |
0x45BF |
B+树叶节点 |
|
FIL_PAGE_UNDO_LOGO |
0x0002 |
UNDO LOG页 |
|
FIL_PAGE_INODE |
0x0003 |
索引节点 |
|
FIL_PAGE_IBUF_FREE_LIST |
0x0004 |
InsertBuffer空闲列表 |
|
FIL_PAGE_TYPE_ALLOCATED |
0x0000 |
该页的最新分配 |
|
FIL_PAGE_IBUF_BITMAP |
0x0005 |
InsertBuffer位图 |
|
FIL_PAGE_TYPE_SYS |
0x0006 |
系统页 |
|
FIL_PAGE_TYPE_TRX_SYS |
0x0007 |
事务系统数据 |
|
FIL_PAGE_TYPE_FSP_HDR |
0x0008 |
FILE SPACE HEADER |
|
FIL_PAGE_TYPE_XDES |
0x0009 |
扩展描述页 |
|
FIL_PAGE_TYPE_BLOB |
0x000A |
BLOB页 |
|
PAGE HEADER |
||
|
名称 |
大小 |
说明 |
|
PAGE_N_DIR_SLOTS |
2 |
在PageDirectory(页目录)中的slot(槽)数。 |
|
PAGE_HEAD_TOP |
2 |
堆中第一个记录的指针 |
|
PAGE_N_HEAP |
2 |
堆中的记录数 |
|
PAGE_FREE |
2 |
指向空间列表的首指针 |
|
PAGE_GARBAGE |
2 |
已经删队记录的字节数,即行记录结构中,delete Flag为1的记录的总数 |
|
PAGE_LAST_INSERT |
2 |
最后插入记录的位置 |
|
PAGE_DIRECTION |
2 |
最后插入记录的所在页的方向,可能会在左侧页PAGE_LEFT(0x01),右侧页, |
|
PAGE_N_DIRECTION |
2 |
一个方向连续插入记录的数量 |
|
PAGE_N_RECS |
2 |
该页中记录的数量 |
|
PAGE_MAX_TRX_ID |
8 |
修改当前页的最大事务ID。仅在辅助索引中定义 |
|
PAGE_LEVEL |
2 |
当前面在索引树中的位置,0x00代表叶节点 |
|
PAGE_INDEX_ID |
8 |
当前页属于哪个索引ID |
|
PAGE_BTR_SEG_LEAF |
10 |
B+树的叶节点中,文件段的首指针位置。仅在B+树ROOT页定义 |
|
PAGE_BTR_SEG_TOP |
10 |
B+树的非叶节点中,文件段的首指针位置。仅在B+树ROOT页定义 |
IFNIMUM极小(首条虚拟记录)与SUPERMUM极大(末条虚拟记录),虚拟的行记录,限定记录的边界。
USER RECORDS:实际存储的行记录内容
FREE SPACES:空闲空间。链表数据结构,当一条记录被删除后,该空间会被加入空间链表中。
PAGE DIRECTORY,存放的是记录的相对于页的位置地址。这些记录指针称为SLOTS或目录槽,DIRECTORY SLOTS。INNODB的PAGE DIRECTORY并不是存放指向所有行记录地址,这稀疏目录(spare directory),即一个槽中可能属于多少记录,最少属于4条,(也可能是1条),最多属于8条记录。槽中的记录按键的顺序存放。
|
INNODB FILE TRAILER |
||
|
前4字节代表该页CHECKSUM值 |
两者比较 |
后4字节与本页FILE HEADER中的FILE_PAGE_LSN 相同 |
|
通过这两个值的比较,看是否一致。以保证页的完整性。 |
||
实际比较
FILETAIL部分
这里比较的LSN是一致的,但CHECKSUM不一致。 再次DUMP一次。两个CHECKSUM就一致,不理解这是为了什么。Lsn不一致。。。00 00 00 00 22 A5 90 B9=
这个解读折腾一整个下午。这是PAGE HEADER的解读。
PAGE_HEAP_TOP
页内空闲页地址的起始,是当前页起始位置加上这个偏移值获得的。C000+0D9E=CD9E
PAGE_LAST_INSERT
最后插入记录的偏移量,同样也是从页起始算起。C000+0D83=CD83。注意,这个指向,不指向带有RECORDER HEADER和各种ID的,是直接指向记录的。当进了删除操作时,这个位置变为了0000
N_PAGE_RECS。。。0x63是实际记录,0x63=99,是对的。在删除10条后,再看它变成了0x005A。是在更新的,这个项叫。
PAGE_N_HEAP是带有两行伪记录的行数,在删除了10行后,PAGE_N_HEAP是没有变化,还是0x8065,而后边的PAGE_FREE,和PAGE_GARBAGE这两项之前都是0000
PAGE_FREE的,0x18F是399,猜测是本页还可以再插入399条记录。
PAGE_GARBAGE是0x132,306,说是垃圾记录的字节数,应该该。306/已经删除的10=30.6B,一条记录,大概占用,34B,,还真是。
PAGE DIRECTORY的槽数量,本例中为0x0119,就是281条记录。因为是稀疏目录,槽不可能记录所有的记录。
去本页页底找一下。黄标为INNODB
FILE TRAILER ,前面就是PAGE
DIRECTORY ,存放是记录相对页的位置。
Page Directory中存放了按主键顺序存放着,行的相对位置(是页相对位置而不是偏移量)。因为是稀疏的,还需要RECORD_HEAD中的n_owned去进一步判断。
伪记录Infimum的n_owned值总是1,记录Supremum的n_owned的取值范围为[1,8],其他用户记录n_owned的取值范围[4,8]。当记录被插入或者删除时需要对槽进行分裂或平衡的维护操作。在Slots中记录是按照索引键值进行存放的,这个样子可以利用二叉查找迅速找到记录的指针。由于InnoDB存储引擎中Page
Directory是稀疏目录,二叉查找的结果是一个粗略的结果,因此InnoDB存储引擎必须通过record header中的next_record来继续查找相关记录。B+树索引本身并不能找到具体的一条记录,能找到只是该记录所在的页。数据库把页载入到内存中,然后通过Page Directory在进行二叉查找。二叉查找的时间复杂度很低,同时在内存中的查找很快,因此通常忽略这部分查找所用的时间。
关于行记录RECORD HEADER
两条伪行
实际数据行
白色是recorder header,最后两位是偏移量,第一位是N_OWNED,,,,,,,,红色是 实际的键值 ,,,,,黄色是TRANSACTION id,,,,红砖色是ROLL POINTER,,,,,,,后边的紫色的是行存储的实际的值。
INNODB 数据页结构的更多相关文章
- InnoDB数据页结构
前言 关于数据库我们知道是通过内存对磁盘进行操作的,也知道数据会落实到磁盘上,但是数据在磁盘上的存储结构可能大家还不是很清楚. MySQL服务器上负责对表中的数据的读取和写入的工作的部分是存储 ...
- InnoDB存储引擎介绍-(7) Innodb数据页结构
数据页结构 File Header 总共38 Bytes,记录页的头信息 名称 大小(Bytes) 描述 FIL_PAGE_SPACE 4 该页的checksum值 FIL_PAGE_OFFSET 4 ...
- MySQL之InnoDB数据页结构(转自掘金小册 MySQL是怎样运行的,版权归作者所有!)
InnoDB为了不同的目的而设计了不同类型的页,我们把用于存放记录的页叫做数据页. 一个数据页可以被大致划分为7个部分,分别是 File Header,表示页的一些通用信息,占固定的38字节. Pag ...
- InnoDB行记录格式(compact)、InnoDB数据页结构
1. compact 行记录格式: 变长字段长度列表,null标志位,记录头信息,列1数据,列2数据 …… 记录头信息中包含许多信息,只列举一部分: 名称 大小 描述 deleted_flag 1bi ...
- InnoDB的数据页结构
页是InnoDB存储引擎管理数据库的最小磁盘单位.页类型为B-tree node的页,存放的即是表中行的实际数据了. InnoDB数据页由以下七个部分组成,如图所示: File Header(文件头) ...
- 数据页结构 .InnoDb行格式、以及索引底层原理分析
局部性原理 局部性原理是指CPU访问存储器时,无论是存取指令还是存取数据,所访问的存储单元都趋于聚集在一个较小的连续区域中. 首先要明白局部性原理能解决的是什么问题,也就是主存容量远远比缓存大, CP ...
- Mysql之InnoDB行格式、数据页结构
Mysql架构图 存储引擎负责对表中的数据的进行读取和写入,常用的存储引擎有InnoDB.MyISAM.Memory等,不同的存储引擎有自己的特性,数据在不同存储引擎中存放的格式也是不同的,比如Mem ...
- MySQL · 引擎特性 · InnoDB 数据页解析
前言 之前介绍的月报中,详细介绍了InnoDB Buffer Pool的实现细节,Buffer Pool主要就是用来存储数据页的,是数据页在内存中的动态存储方式,而本文介绍一下数据页在磁盘上的静态存储 ...
- SQL Server 存储(1/8):理解数据页结构
我们都很清楚SQL Server用8KB 的页来存储数据,并且在SQL Server里磁盘 I/O 操作在页级执行.也就是说,SQL Server 读取或写入所有数据页.页有不同的类型,像数据页,GA ...
随机推荐
- opencv-0-项目启程
opencv-0-项目启程 opencvC++QT 开始 无数次说要开始 opencv 的系列, 但是都由于各种原因没有坚持下去, 这次我做最后一次尝试, 也做最后一次坚持, 如果不做下去, 我就再也 ...
- 【阅读笔记】Ranking Relevance in Yahoo Search (四 / 完结篇)—— recency-sensitive ranking
7. RECENCY-SENSITIVE RANKING 作用: 为recency-sensitive的query提高排序质量: 对于这类query,用户不仅要相关的还需要最新的信息: 方法:rece ...
- Dubbo(六):zookeeper注册中心的应用
Dubbo中有一个非常本质和重要的功能,那就是服务的自动注册与发现,而这个功能是通过注册中心来实现的.而dubbo中考虑了外部许多的注册组件的实现,zk,redis,etcd,consul,eurek ...
- 前端——Vue-cli 通过UI页面创建项目
在使用该教程创建项目时请先安装vue ui,具体安装方法请百度 1.打开CMD,输入vue ui 2.点击创建按钮,选择项目目录 3.填写项目名 4.配置项目 选择项目所需要的模块
- 常用设计模式的实现,以及Netty中的设计模式
1.观察者模式 有两个角色,观察者和被观察者.当被观察者发出消息后,注册了的观察者会收到其消息,而没有注册的观察者就不会收到. //定义观察者接口 interface Observer{ //通知观察 ...
- V - Can you answer these queries? HDU - 4027 线段树 暴力
V - Can you answer these queries? HDU - 4027 这个题目开始没什么思路,因为不知道要怎么去区间更新这个开根号. 然后稍微看了一下题解,因为每一个数开根号最多开 ...
- Dynamics 9.0 安装好后 公告出现 提示:出现错误。 请稍等片刻,然后重试。 如果问题仍然存在,请与管理员联系。
此问题为系统的Bug,示例图如下: 解决方案为修改存储过程 p_RetrievePosts,将startDate参数的默认值改成 1900-01-01,endDate参数的默认值改成 9999-12- ...
- Idea中查看一个类的所有资料及其层级关系
在Idea中直接Ctrl + t 查看类的子类是可以看到,但是他没有那种层级顺序! 我们可以在类中点击顶部菜单Navigate -----> Type Hierarchy
- 【Spark】使用java语言开发spark程序
目录 步骤 一.创建maven工程,导入jar包 二.开发代码 步骤 一.创建maven工程,导入jar包 <properties> <scala.version>2.11.8 ...
- STM32F767ZI NUCLEO144 基于CubeIDE快速开发入门指南
刚入手的NUCLEO-F767ZI:整合官网资源,理清思路,便于快速进行快发: 文章目录 1 NUCLEO 系列 2 NUCLEO-F767ZI 3 环境搭建 3.1 Keil/IAR安装 3.2 C ...