热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【MySQLInnoDB读书笔记】09InnoDB下逻辑存储结构(二):数据页的逻辑存储及实现

【MySQLInnoDB读书笔记】09InnoDB下逻辑存储结构(二):数据页的逻辑存储及实现-文章目录一、InnoDB数据页存储结构1.FileHeader2.PageHe

一、InnoDB 数据页存储结构

innodb 存储引擎数据页结构如图所示:

InnoDB 数据页由 7 个部分组成:

  • File Header :文件头
  • Page Header:页头
  • Infimun 和 Supremum Records
  • User Records:用户记录,即行记录
  • Free Space:空闲空间
  • Page Directory:页目录
  • File Trailer:文件结尾信息

1. File Header

File Header用来记录页的一些头信息,共占用 38 个字节,具体记录了哪些信息如下表所示:

名称大小说明
FIL_PAGE_SPACE_OR_CHKSUM4MySQL 版本 4. 0 之前该值为 0,版本 4.0 之后该值代表页的 checksum 值
FIL_PAGE_OFFSET4表空间中页的偏移量,表示当前页在所有页中的偏移量,例如(10,1)表示查找表空间 ID 为 10 的第二个页
FIL_PAGE_PREV4当前页的上一个页,B+ 树的叶子节点之间链接形成双向链表
FIL_PAGE_NEXT4当前页的下一个页,B+ 树的叶子节点之间链接形成双向链表
FIL_PAGE_LSN8代表当前页最后被修改的日志序列位置
FIL_PAGE_TYPE2InnoDB 存储引擎页的类型
FIL_PAGE_FILE_FLUSH_LSN8该值仅仅在 系统表空间 的一个页中定义,对于独立表空间该值为0,含义是文件至少被更新到了该 LSN 值
FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID4MySQL 版本 4.1 之后,该值表示页属于哪个表空间
  • FIL_PAGE_TYPE的取值和含义如下表所示:
/** File page types (values of FIL_PAGE_TYPE) @{ */
#define FIL_PAGE_INDEX		17855	/*!
#define FIL_PAGE_RTREE		17854	/*!
#define FIL_PAGE_UNDO_LOG	2	/*!
#define FIL_PAGE_INODE		3	/*!
#define FIL_PAGE_IBUF_FREE_LIST	4	/*!
/* File page types introduced in MySQL/InnoDB 5.1.7 */
#define FIL_PAGE_TYPE_ALLOCATED	0	/*!
#define FIL_PAGE_IBUF_BITMAP	5	/*!
#define FIL_PAGE_TYPE_SYS	6	/*!
#define FIL_PAGE_TYPE_TRX_SYS	7	/*!
#define FIL_PAGE_TYPE_FSP_HDR	8	/*!
#define FIL_PAGE_TYPE_XDES	9	/*!
#define FIL_PAGE_TYPE_BLOB	10	/*!
#define FIL_PAGE_TYPE_ZBLOB	11	/*!
#define FIL_PAGE_TYPE_ZBLOB2	12	/*!
#define FIL_PAGE_TYPE_UNKNOWN	13	/*!
#define FIL_PAGE_COMPRESSED	14	/*!
#define FIL_PAGE_ENCRYPTED	15	/*!
#define FIL_PAGE_COMPRESSED_AND_ENCRYPTED 16/*!
#define FIL_PAGE_ENCRYPTED_RTREE 17	/*!
常量名称十六进制含义
FIL_PAGE_INDEX0x45BFB+ 数叶子节点(数据节点)
FIL_PAGE_UNDO_LOG0x0002undo log 页
FIL_PAGE_INODE0x0003索引节点
FIL_PAGE_IBUF_FREE_LIST0x0004insert buffer 空闲列表页
FIL_PAGE_TYPE_ALLOCATED0x0000最新分配还未使用的页
FIL_PAGE_IBUF_BITMAP0x0005insert buffer 位图页
FIL_PAGE_TYPE_SYS0x0006系统页
FIL_PAGE_TYPE_TRX_SYS0x0007事务系统数据页
FIL_PAGE_TYPE_FSP_HDR0x0008File Space Header 页
FIL_PAGE_TYPE_XDES0x0009扩展描述页
FIL_PAGE_TYPE_BLOB0x000ABLOB 页

2. Page Header

Page Header 用来记录数据页的状态信息,共占用 56 字节,具体信息如下表所示:

名称大小(字节)说明
PAGE_N_DIR_SLOTS2表示页目录(Page Directory)中的槽(Slot)数量
PAGE_HEAP_TOP2记录在页中是以堆的形式存放的,该值存放的是指向第一个记录的指针
PAGE_N_HEAP2堆中的记录数,一共占用 2 个字节
PAGE_FREE2指向可重用空间的首指针
PAGE_GARBAGE2行记录中 delete flag 为 1 的总字节数,即被删除的记录的大小总和
PAGE_LAST_INSERT2最后插入记录的位置
PAGE_DIRECTION2最后插入的方向
PAGE_N_DIRECTION2一个方向连续插入记录的数量
PAGE_N_RECS2该页中记录的数量
PAGE_MAX_TRX_ID8修改当前页的最大事务ID,注意该值仅在 Secondary Index 中定义
PAGE_LEVEL2当前页在索引树中的位置,0x00表示叶节点
PAGE_INDEX_ID8索引ID,表示当前页属于哪个索引
PAGE_BTR_SEG_LEAF10B+ 树数据页非叶节点所在段的 segment header
PAGE_BTR_SEG_TOP10B+ 树数据页所在段的 segment header

3. Infimun Records 和 Supremum Records

Infimun 记录是比该页中任何主键值都要小的值,Supremum 记录是比任何可能大的值还要大的值,这两个值在页创建时被建立,并且在任何情况下都不会被删除。这两个记录位于页中的所有航记录数据的收尾处,如图所示:

4. User Records

User Records实际存储行记录的内容,如图:

5. Free Space

Free Space指的是空闲空间,同样也是使用链表来进行组织的,在一条记录被删除后,该空间会被自动加入到空闲列表中

6. Page Directory

Page Directory顾名思义是这个页的所有记录的一个目录,存放着数量可变记录指针,这些指针指向页中存放的记录,有时记录指针被称为,所以Page Directorty有时被称为目录槽,在InnoDB页面中并不是一个记录指针对应一个记录,而是若干个(1~8)记录对应一个记录指针,在完整的页面中,每六条记录将有一个槽。

记录的头信息中有一个大小为4位的n_owned,表示管理当前记录的槽一共管理了多少个记录。

举例:如果一个页中的记录是‘A’、‘B’、‘F’、‘D’,记录指针将是(pointer to ‘A’)、(pointer to ‘B’)、(pointer to ‘D’)、(pointer to ‘F’)

由举例可知,指针的排列顺序是按照键值的顺序排列的,故在查找某一条记录时,可以通过二分查找的方式进行查找

所以查找一条记录的过程为:先在 B+ 树上定位到记录所在的叶子节点(数据页),然后将整个数据页载入到内存中,然后在目录槽中进行二分查找目标记录所在的槽,然后在槽所管理的若干条记录中寻找目标记录

7. File Trailer

为了检测页向磁盘中写入的过程中是否产生损坏,在 InnoDB 存储引擎页中设置了 File Trailer 来做检验。

File Trailer 组成:只有一个 FIL_PAGE_END_LSN 部分,占用 8 字节,前 4 字节代表此页的 checksum 值,最后 4 字节和 File Header 中的 FIL_PAGE_LSN 相同

检查原理:将 8 字节的 File Trailer 与 File Header 中的 FIL_PAGE_SPACE_OR_CHKSUM 和 FIL_PAGE_LSN 组成的 8 字节作比较(并不是简单的等值比较,而是需要通过检查 checksum 的算法)。

检查 checksum 的算法:通过参数innodb_checksum_algorithm 来控制,可设置的算法有:crc32、none、strict_innodb、strict_crc32、strict_none,其中strict_*的算法表示严格按照设置的算法进行页的检测

MySQL [(none)]> show variables like 'innodb_checksum_algorithm'\G;
*************************** 1. row ***************************
Variable_name: innodb_checksum_algorithm
        Value: crc32
1 row in set, 1 warning (0.08 sec)

是否开启对页的完整性检查由参数innodb_checksums控制:

MySQL [(none)]> show variables like 'innodb_checksums'\G;
*************************** 1. row ***************************
Variable_name: innodb_checksums
        Value: ON
1 row in set, 1 warning (0.00 sec)

推荐阅读
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了Perl的测试框架Test::Base,它是一个数据驱动的测试框架,可以自动进行单元测试,省去手工编写测试程序的麻烦。与Test::More完全兼容,使用方法简单。以plural函数为例,展示了Test::Base的使用方法。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • mysql-cluster集群sql节点高可用keepalived的故障处理过程
    本文描述了mysql-cluster集群sql节点高可用keepalived的故障处理过程,包括故障发生时间、故障描述、故障分析等内容。根据keepalived的日志分析,发现bogus VRRP packet received on eth0 !!!等错误信息,进而导致vip地址失效,使得mysql-cluster的api无法访问。针对这个问题,本文提供了相应的解决方案。 ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • 本文讨论了如何使用IF函数从基于有限输入列表的有限输出列表中获取输出,并提出了是否有更快/更有效的执行代码的方法。作者希望了解是否有办法缩短代码,并从自我开发的角度来看是否有更好的方法。提供的代码可以按原样工作,但作者想知道是否有更好的方法来执行这样的任务。 ... [详细]
  • 本文介绍了在MySQL8.0中如何查看性能并解析SQL执行顺序。首先介绍了查询性能工具的开启方法,然后详细解析了SQL执行顺序中的每个步骤,包括from、on、join、where、group by、having、select distinct、union、order by和limit。同时还介绍了虚拟表的概念和生成过程。通过本文的解析,读者可以更好地理解MySQL8.0中的性能查看和SQL执行顺序。 ... [详细]
  • 本文讨论了一个数列求和问题,该数列按照一定规律生成。通过观察数列的规律,我们可以得出求解该问题的算法。具体算法为计算前n项i*f[i]的和,其中f[i]表示数列中有i个数字。根据参考的思路,我们可以将算法的时间复杂度控制在O(n),即计算到5e5即可满足1e9的要求。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • This article discusses the efficiency of using char str[] and char *str and whether there is any reason to prefer one over the other. It explains the difference between the two and provides an example to illustrate their usage. ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
author-avatar
Hancl
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有