InnoDB 数据页结构

页是 InnoDB 管理存储空间的基本单位,InnoDB 为了不同的目的设计了不同类型的页,比如,这里我们讨论的是存储表中记录的数据页。

数据页结构简图:


image.png
名称 中文名 占用空间大小 简单描述
File Header 文件头部 38字节 页的一些通用信息
File Header 文件头部 38字节 页的一些通用信息
File Header 文件头部 38字节 页的一些通用信息
File Header 文件头部 38字节 页的一些通用信息
File Header 文件头部 38字节 页的一些通用信息
File Header 文件头部 38字节 页的一些通用信息
File Header 文件头部 38字节 页的一些通用信息
记录在页中的存储

当页一开始生成的时候,其实并没有 User Record 部分,每当插入一条记录时,都会从 Free Space 部分申请一个记录大小的空间,并将这个空间划分到 User Record 部分。

image.png
  • 记录头部信息
    记录头信息由固定的 5 字节组成,用于描述记录的一些属性。

    名称 大小 描述
    预留位1 1 没有使用
    预留位2 1 没有使用
    deleted_flag 1 标记该记录是否被删除
    min_re_flag 1 B+树的每层非叶子节点中最小的目录项都会添加该标记
    n_owned
    heap_no
    record_type
    next_record
    image.png
    • deleted_flag
      占用1比特,值为0表示记录没有被删除,值为1表示记录被删除了。

    • min_rec_flag
      后面介绍

    • n_owned
      后面介绍

    • heap_no
      InnoDB 把记录一条一条亲密无间的排列的结构称之为堆,为了方便管理,把一条记录在堆中相对位置称之为heap_no,每当一条插入一条新纪录,该记录的 heap_no 比前一条记录的heap_no +1

      InnoDB 会自动给每个页面加入2条记录 Infimum 和 Supremum。
      它们构造十分简单,都是由5字节大小的记录头信息和8字节大小的固定单词组成

      • Infimum,代表页面中的最小记录,按照主键比较大小


        image.png
      • Supremum,代表页面中的最大记录的下一条记录(类似链表的最后NULL),按照主键比较大小


        image.png
    • record_type

      • 0 表示普通记录
      • 1 表示B+树非叶节点的目录项记录
      • 2 表示 Infimum 记录
      • 3 表示 Supremum 记录
    • next_record
      表示从当前记录的真实数据到下一条记录的真实数据的距离。这里的这个下一条记录并不是指插入顺序中的下一条记录,而是按照主键大小由小到大的顺序排列的下一条记录。
      举例:

      image.png
Page Directory 页目录

记录在页中是按照主键大小由小到大的顺序串联成一个单向链表。

最笨的方法是从记录开始,沿着单向链表一直往后找,当页中存储的记录比较少时,这样查找倒也没什么问题。但是记录很多时,这个查找效率就不高了。为了提高查找效率,InnoDB为记录制作了一个目录:

  • 将所有正常的记录,但不包括已经移除到垃圾链表中的记录,划分为几组
  • 每个组的最后一条记录的头信息中的n_owned属性表示该组内 有几条记录。
  • 将每个组中最后一条记录在页面中的地址偏移量(该记录的真实数据与页面中第0字节的距离)提取出来,按顺序存储到靠近页尾部的地方。这个地方就是 Page Directory,这些地址偏移量称为槽,每个槽占用2字节。
image.png

以Infimum记录的n_owned值为1,表示以记录Infimum为最后一个节点的这个组只有1条记录,那就是本身。
以Supremum记录的n_owned值为5,表示以记录Supremum为最后一个节点的这个组有5条记录。

关于这个分组数量的确定,也有规则:
对于Infimum记录所在的分组只能有1条记录,
Supremum记录所在的分组拥有的记录条数在1~8之间
剩下的分组中记录的条数在4~8之间。

这时,回到开头的问题,在一个数据页中查找指定主键值记录时,过程分为2步:

  • 通过二分法确定该记录所在分组对应的槽。
  • 通过记录的next_record属性遍历该槽所在的组中的各个记录。
File Header
Page Header
File Trailer
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335

推荐阅读更多精彩内容

  • 不同类型的页简介 前边我们简单提了一下页的概念,它是InnoDB管理存储空间的基本单位,一个页的大小一般是16KB...
    tracy_668阅读 1,147评论 1 6
  • Mysql--InnoDB数据页结构 页 1.页是innodb管理存储空间的基本单位 2.一般大小是16kb 3....
    简书徐小耳阅读 2,454评论 1 1
  • 原文链接 - InnoDB数据页结构 页是MySQL管理存储空间的基本单位,一个页的大小一般是16KB,并且记录其...
    wpf_register阅读 382评论 0 1
  • 表情是什么,我认为表情就是表现出来的情绪。表情可以传达很多信息。高兴了当然就笑了,难过就哭了。两者是相互影响密不可...
    Persistenc_6aea阅读 123,155评论 2 7
  • 16宿命:用概率思维提高你的胜算 以前的我是风险厌恶者,不喜欢去冒险,但是人生放弃了冒险,也就放弃了无数的可能。 ...
    yichen大刀阅读 6,018评论 0 4