美文网首页
10.1 InnoDB表空间 (gold_axe)

10.1 InnoDB表空间 (gold_axe)

作者: 胖达_4b7e | 来源:发表于2019-07-21 23:28 被阅读0次

独立表空间:

一个表一个, 对应数据库的同名文件夹下的 表名.ibd文件, 里面是很多页

页:

大概16kb,管理存储的最小单位.

有各种不同类型的页 , 比如:

  • FIL_PAGE_INDEX 索引页,也就是我们所说的数据页
  • FIL_PAGE_TYPE_ALLOCATED 最新分配,还没使用
  • FIL_PAGE_INODE 段信息节点
    页头都有写这个页的类型

除此之外, 页头还有写:

  • 上一页,下一页: 记的是页号(注意是页号不是物理地址, 有号还需要找)
  • 属于哪个表空间
  • 校验和
  • 页号: 唯一标识本页

区(extent),段(segment) ,组

64个连续的页, 是一个区
区的大小是 64*16kb=1M
256个区是一组

如图,
第一组的第一页类型是 FSP_HDR 描述本组的属性和本组的区的属性
第二页第三页也是固定的类型


其他组的开始2页也是固定的类型, 用来描述本组的信息


分区是因为

虽然每页都有下一页上一页的页号, 可以找到那页, 物理上可能隔着好远, 这种给号码取东西的叫随机I/O, 很慢, 需要避免, 我们需要让相邻的页物理上也尽量近, 这样才能用顺序I/O 比较快
这个连续区域 叫
做法是:

  1. 数据才开始插入的时候, 先从碎片区取单个页没来存储

2.页>32个(半个区), 就给这个段分配整个区

一个表至少2 个段: 主键索引的 一个叶子节点, 一个非叶节点,
加一个索引加2个段

3种结构体

1. XDES Entry : 区

全称就是Extent Descriptor Entry,每一个(64页,1M)都对应着一个XDES Entry结构, 管理着每个区

描述是本区的64个页 是属于哪个段的(也可能还没用到,不属于哪个段,或者是直属表空间的碎片区),本区64页那些还空着, 本区是属于哪个链的(同链一样的状况 满了/没满/全空 属于段直属空间),下一个上一个是谁

  • Segment ID 是 段的Id, 当然这个区还没有用到 ,或者是碎片区 这个就没用了
  • List Node
    指向上一个XDES Entry, 下一个XDES Entry

这样能找到上一个下一个,就可以把XDES连成双向链表, 表空间里面有这么6种XDES结构体链表:

  • 管理直属于表空间的区(就是碎片区)的XDES结构体链表(满/空/未满)
  • 管理属于段的区的XDES结构体链表(满/空/未满)
CREATE TABLE t (
    c1 INT NOT NULL AUTO_INCREMENT,
    c2 VARCHAR(100),
    c3 VARCHAR(100),
    PRIMARY KEY (c1),# 索引1
    KEY idx_c2 (c2) #索引2
)ENGINE=InnoDB;

这样一个2个索引的表 和15个XDES结构体链有关:
3[直属于表空间的链,放不成区的碎片]+2[2个索引] * 2[2段:叶子非叶] * 3[属于段的链]

  • State
    记录本区是: 属于

    • 某个段的区
    • 空闲
    • 有剩余的碎片区
    • 满的碎片区,
  • Page State Bitmap
    描述区内每个页是否空闲

2. List Base Node :双向链表

基节点, 描述一个链表
记载了 一个双向链表的 开始 结束 长度
双向链表可以是XDES Entry 结构体(描述一个区的)链表

3. INODE Entry : 段

描述

橙色: 描述哪个段(段号)
蓝色: 三个 XDES Entry 结构体链表的基节点(有链表的开始结束长度)
灰色: 几个零散页面(最多8个)的页号(对应存在直属表空间的碎片区里面的页)

为什么要分组

要把XDES Entry 集中放一页, 一页放多了XDES Entry 放不下(一个XDES Entry固定40字节 ) 所以给区分组

每组第一页是集中放XDES Entry ,集中放的256个XDES Entry 对应组里面256个区

这种页一般都叫XDES页
除了表空间的第一组第一页,叫FSP_HDR页, 因为它是一个表空间的第一页 除了要记256个XDES Entry 还有其他东西要记

这样 每个区对应的 XDES Entry 都在固定的地方 找起来很快

FSP_HDR页

每个表空间里面只有一个这种页
是第一页
和其他组一样 要记256个XDES Entry, 还有

  • 直属表空间的 3个XDES链(碎片区的)的基节点List Base Node
  • 还未记入任何XDES链 没初始化的页
  • INODE链(描述段的)的基节点List Base Node 满/空 2条各一个

INODE页

每个表空间里面只有一个这种页
是第3页
是放本表空间 所有INODE结构体的
但是, 表空间(一个库) 可能有很多索引 段可能有很多, 所以一页可能不够放,
所以INODE页其实也组成双向链表, 每个INODE也都有记着上一页下一页
一个表空间里面有2个 INODE页组成的双向链表, 一个满的 一个空的,
有新的段需要一个INODE的话, 先去空的INODE链表找, 里面没有了 就从表空间的碎片区空闲链里面划一个到 INODE空闲链

索引怎么找到自己的段对应的INODE?

根节点所在的页(数据字典里面有跟节点的页号) 在 页通用的File Header 后面有个Page Head, 里面记着 非叶节点段 和 叶节点段 对应的 在哪个INODE页(页号),INODE页的哪个位置是这个段对应INODE Entry(偏移量)
是用这个结构体记的
Segment Header

相关文章

  • 10.1 InnoDB表空间 (gold_axe)

    独立表空间: 一个表一个, 对应数据库的同名文件夹下的 表名.ibd文件, 里面是很多页 页: 大概16kb,管理...

  • Mysql之InnoDB存储结构

    InnoDB存储结构 Innodb逻辑存储单元为为表空间,段,区,页 InnoDB表空间 InnoDB存储引擎表中...

  • 10.2 InnoDB系统表空间 (gold_axe)

    实际文件 数据目录下 有个 ibdata1 就是系统表空间 看数据目录SHOW VARIABLES LIKE 'd...

  • innodb文件结构解析

    innodb 物理文件解析 1 综述 innodb的物理文件包括系统表空间文件ibdata,用户表空间文件ibd,...

  • 浅谈MySQL中的ibdata1

    前言:InnoDB中有共享表空间和独立表空间的概念。共享表空间就是ibdata1,独立表空间放在每个表的.ibd(...

  • InnoDB-B+树索引[一]

    InnoDB知识点梳理 InnoDB逻辑存储结构 表空间:数据都存放在表空间之下 段:数据段,索引段,回滚段 区:...

  • mysql数据物理结构

    表空间:ibdata公用表空间文件,也可以通过配置innodb_file_per_table设置独立表空间文件 i...

  • InnoDB 共享表空间 & 独立表空间

    默认,所有innodb的table和indexcu存储在system tablespace(共享表空间)。也可以把...

  • InnoDB 表空间(一)

    MySQL 数据目录 如何确定 MySQL 数据目录> SHOW VARIABLES LIKE 'datadir'...

  • InnoDB 表空间(二)

    页面类型 InnoDB 是以页为单位来管理存储空间的,针对不同的使用场景设计了不同类型的页面。 类型名称十六进制描...

网友评论

      本文标题:10.1 InnoDB表空间 (gold_axe)

      本文链接:https://www.haomeiwen.com/subject/vruxlctx.html