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. 文件上传报错:Unknown: file created in the system's temporary directory

    nginx+php下文件上传成功,但会有错误提示如下: <b>Notice</b>:  Unknown: file created in the system's tempor ...

  2. java 整合redis缓存 SSM 后台框架 rest接口 shiro druid maven bootstrap html5

    A 调用摄像头拍照,自定义裁剪编辑头像,头像图片色度调节B 集成代码生成器 [正反双向](单表.主表.明细表.树形表,快速开发利器)+快速表单构建器 freemaker模版技术 ,0个代码不用写,生成 ...

  3. 【Puppeteer】puppeteer安装/常用的方法以及一个小栗子(Youtube油管自动评论)

    这里介绍的是Win平台的安装方法,其他平台请至Github>Puppeteer. 首先要安装node.js 可以看我这篇的开头>[Angular]学习笔记-环境部署.项目建立相关 1.新建 ...

  4. Python3操作MySQL基于PyMySQL封装的类

    Python3操作MySQL基于PyMySQL封装的类   在未使用操作数据库的框架开发项目的时候,我们需要自己处理数据库连接问题,今天在做一个Python的演示项目,写一个操作MySQL数据库的类, ...

  5. SecureCRT 破解安装详细教程

    SecureCRT是一款支持SSH(SSH1和SSH2)的终端仿真程序  跟xshell类似. 一.下载文件软件包和破解文件(64版本),我已经放在百度云,链接:https://pan.baidu.c ...

  6. FTP安装及配置

    在centos7安装ftp服务 yum install -y vsftpd 启动服务 systemctl start vsftpd 自启动 systemctl enable vsftpd 查看端口 注 ...

  7. Codeforces Round #602 (Div. 2, based on Technocup 2020 Elimination Round 3

    A,有多个线段,求一条最短的线段长度,能过覆盖到所又线段,例如(2,4)和(5,6) 那么我们需要4 5连起来,长度为1,例如(2,10)(3,11),用(3,10) 思路:我们想一下如果题目说的是最 ...

  8. java学习路线推荐,希望能帮到你

    很多小白刚开始学习java时,肯定迷惘过,因为对java基本是啥也不懂的,一直想知道java的具体学习路线,我曾经也看了许许多多的java经验分享的帖子,评论,以及其他各种培训机构所谓的学习路线,特别 ...

  9. [译]Vulkan教程(12)图形管道基础之入门

    [译]Vulkan教程(12)图形管道基础之入门 Introduction 入门 Over the course of the next few chapters we'll be setting u ...

  10. Codeforces Round #590 D. Distinct Characters Queries

    CF上给的标签是数据结构.但给的题解里的方法是很巧的暴力,用vector<set>维护每个字母出现的下标,每次修改加下标,擦下标.每次询问对每个字母分别lower_bound查找区间内是否 ...