MySQL InnoDB 索引 (INDEX) 页结构

InnoDB 为了不同的目的而设计了不同类型的页,我们把用于存放记录的页叫做索引页

索引页内容

索引页分为以下部分:

  • File Header:表示页的一些通用信息,占固定的38字节
  • Page Header:表索引页专有的一些信息,占固定的56个字节
  • Infimum & Supremum:两个虚拟的伪记录,分别表示页中的最小和最大记录,占固定的26个字节
  • User Records:真实存储我们插入的记录的部分,大小不固定
  • Free Space:页中尚未使用的部分,大小不固定
  • Page Directory:页中的某些记录相对位置,也就是各个槽在页面中的地址偏移量,大小不固定,插入的记录越多,这个部分占用的空间越多
  • File Trailer:用于检验页是否完整的部分,占用固定的8个字节

文件头部(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_PREVFIL_PAGE_NEXT 代表上一页和下一页的页码,使得多个索引页之间像双向链表一样连接起来

页面头部(Page Header)

页面头部索引页特有的,记录了当前页面的状态信息
包含以下部分:

名称 大小 (byte) 作用
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 页定义

最小记录(Infimum) & 最大纪录(Supremum)

两个虚拟的行记录,分别位于记录链表的开头和结尾

用户记录(User Records)

用户记录是按照相应行格式存储数据的地方
MySQL 行格式 <- 点击查看

记录之间的连接

以 Compact 为例:
借助 next_record,记录之间像链表一样连接起来,顺序为主键从小到大排序,第一个为最小记录,最后一条为最大纪录
next_record 指向的是下一纪录真数据开始的地方,也就是下一纪录 next_record 之后

删除记录

当其中的一条记录被删除后,上一条记录的 next_record 指向下一条纪录,此记录标记为删除,next_record 指向 0,当前组最后一条记录 n_owned 更新

页目录 (Page Directory)

页目录在靠近页尾部的地方,记录着每组记录中最后一条记录的地址偏移量,每个偏移量被放在槽 (Slot) 中

分组

最小记录所在的分组只能有 1 条记录,最大记录所在的分组拥有的记录条数只能在 1~8 条之间,剩下的分组中记录的条数范围只能在是 4~8 条之间
n_owned 表示当前组中一共有几条记录

查找

由于页目录中记录的主键是有顺序的,所以可以通过二分法进行查找
通过二分法在页目录找到对应的槽,再遍历整个组中的记录

File Trailer

用于确认内存同步到磁盘是否完整
分为两部分:

前 4 个字节:校验和

当一个页面在内存中修改之后,在同步之前需要先计算出校验和
File Header 在页面的前面,所以校验和会先进行同步,File Trialer 在最后进行同步,如果两次校验和不同说明数据改变了

后 4 个字节:LSN

总结

索引页之间的连接

各个索引页可以按照页中最小主键值从小到大组成一个双向链表,每个索引页中的记录又会按照主键值从小到大组成一个单链表

MySQL InnoDB 索引 (INDEX) 页结构的更多相关文章

  1. 转:MySQL InnoDB Add Index实现调研

    MySQL InnoDB Add Index实现调研 MySQL Add Index实现 MySQL各版本,对于add Index的处理方式是不同的,主要有三种: Copy Table方式 这是Inn ...

  2. InnoDB的数据页结构

    页是InnoDB存储引擎管理数据库的最小磁盘单位.页类型为B-tree node的页,存放的即是表中行的实际数据了. InnoDB数据页由以下七个部分组成,如图所示: File Header(文件头) ...

  3. MySQL InnoDB 索引原理

    本文由  网易云发布. 作者:范鹏程,网易考拉海购 InnoDB是 MySQL最常用的存储引擎,了解InnoDB存储引擎的索引对于日常工作有很大的益处,索引的存在便是为了加速数据库行记录的检索.以下是 ...

  4. MySQL InnoDB 索引组织表 & 主键作用

    InnoDB 索引组织表 一.索引组织表定义 在InnoDB存储引擎中,表都是根据主键顺序组织存放的,这种存储方式的表称为索引组织表(index organized table IOT). 在Inno ...

  5. mysql InnoDB 索引小记

    0.索引结构 1).MyISAM与InnoDB索引结构比较,如下: 2).MyISAM的索引结构 主键索引和二级索引结构很像,叶子存储的都是索引以及数据存储的物理地址,其他节点存储的仅仅是索引信息.其 ...

  6. 【原创】MySQL(Innodb)索引的原理

    引言 回想四年前,我在学习mysql的索引这块的时候,老师在讲索引的时候,是像下面这么说的 索引就像一本书的目录.而当用户通过索引查找数据时,就好比用户通过目录查询某章节的某个知识点.这样就帮助用户有 ...

  7. MySQL(Innodb)索引的原理

    引言 回想四年前,我在学习mysql的索引这块的时候,老师在讲索引的时候,是像下面这么说的 索引就像一本书的目录.而当用户通过索引查找数据时,就好比用户通过目录查询某章节的某个知识点.这样就帮助用户有 ...

  8. 为什么mysql innodb索引是B+树数据结构

    1.文件很大,不可能全部存储在内存中,所以要存在磁盘上 2.索引的组织结构要尽量减少查找过程中磁盘I/O的存取次数(为什么用B-/+Tree,还跟磁盘存取原理有关) 3.B+树所有的data域在叶子节 ...

  9. mysql innodb索引原理

    聚集索引(clustered index) innodb存储引擎表是索引组织表,表中数据按照主键顺序存放.其聚集索引就是按照每张表的主键顺序构造一颗B+树,其叶子结点中存放的就是整张表的行记录数据,这 ...

随机推荐

  1. Apply Grouping to List View Data 将分组应用于列表视图数据

    This lesson will teach you how to apply grouping to List View data. For this purpose, you will group ...

  2. Git实战指南----跟着haibiscuit学Git(第六篇)

    笔名:  haibiscuit 博客园: https://www.cnblogs.com/haibiscuit/ Git地址: https://github.com/haibiscuit?tab=re ...

  3. c#实现两个窗体相互传值

    本文转自:https://mp.csdn.net/postedit/100058721 1.功能展示 有时需要将子界面的内容传递到父界面,方法有好几种.经常用的是通过委托实现.具体的效果如下: ​   ...

  4. Android studio 3.4 新建项目报错Error:unable to resolve dependency for app@。。。解决办法

    试过网上很多的例子,有的设置Go to `File->Settings->Build, Execution, Deployment->Gradle->Uncheck Offli ...

  5. RabbitMQ学习笔记(八、RabbitMQ总结)

    1.什么是消息中间件 Message Queue Middleware,简称MQ,是一种利用高效可靠的消息传递机制进行与平台无关的数据交互的技术. 2.MQ的作用 异步:类似于短信业务,将需要发送的消 ...

  6. Object-defineProperty ES5

    Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象. Object.defineProperty(obj, prop, ...

  7. CTPN网络理解

    本文主要对常用的文本检测模型算法进行总结及分析,有的模型笔者切实run过,有的是通过论文及相关代码的分析,如有错误,请不吝指正. 一下进行各个模型的详细解析 CTPN 详解 代码链接:https:// ...

  8. NFS客户端挂载及永久生效

    1.NFS客户端挂载的命令格式: 挂载命令 挂载的格式类型 NFS服务器提供的共享目录 NFS客户端要挂载的目录mount -t nfs 服务器IP:/共享目录 /本地的挂载点(必须存在) 重启失效 ...

  9. C++ 面向对象程序设计复习大纲

     这是我在准备C++考试时整理的提纲,如果是通过搜索引擎搜索到这篇博客的师弟师妹,建议还是先参照PPT和课本,这个大纲也不是很准确,自己总结会更有收获,多去理解含义,不要死记硬背,否则遇到概念辨析题会 ...

  10. Python中7个不一样的代码写法

    打印index 对于一个列表,或者说一个序列我们经常需要打印它的index,一般传统的做法或者说比较low的写法: 更优雅的写法是多用enumerate 两个序列的循环 我们会经常对两个序列进行计算或 ...