天天看点

MySQL学习笔记 004:数据目录、表空间1 数据目录结构2 独立表空间结构

MySQL学习笔记 004:数据目录、表空间

  • 1 数据目录结构
    • 1.1 InnoDB
    • 1.2 MyISAM
    • 1.3 MySQL系统数据库
  • 2 独立表空间结构
    • 2.1 FSP_HDR页
      • 2.1.1 File Space Header
      • 2.1.2 XDES Entry
    • 2.2 XDES页
    • 2.3 IBUF_BITMAP页
    • 2.4 INODE页
    • 2.5 段
    • 2.6 链表
      • 2.6.1 直属于表空间的链表
      • 2.6.2 直属于段的链表

1 数据目录结构

创建数据库后会在数据目录下创建与数据库同名的子目录,该目录下有db.opt文件,用于描述数据库属性。

1.1 InnoDB

数据库同名目录下有.frm文件描述每个表的结构,数据保存在系统表空间或独立表空间。

  • 系统表空间:数据保存在配置文件中指定的文件路径下。
  • 独立表空间:数据保存在数据库同名目录下.idb文件内,.idb文件名为表名。

1.2 MyISAM

数据库同名目录下有.frm文件描述每个表的结构,数据保存在.MYD文件,索引保存在。MYI文件。

1.3 MySQL系统数据库

  • mysql:MySQL账户、权限等信息。
  • information_schema:其他数据库元数据。
  • performance_schema:MySQL运行状态信息。
  • sys:information_shcema与performance_schema结合。

2 独立表空间结构

  • 页:一般16KB。
  • 区(extent):对于16KB页,每64个页组成一个区(1MB)。
  • 组:每256个区分为一组(256MB)。

每个表空间第一个区包含FSP_HDR、IBUF_BITMAP、INODE页。每个组第一个页包含XDES、IBUF_BITMAP页。

2.1 FSP_HDR页

2.1.1 File Space Header

名称 大小 描述
Space ID 4 表空间ID
Size 4 表空间拥有的页面数
Free limit 4 尚未被初始化的最小页号,自增长时标注未被加入FREE链表的页号
Space flag 4 表空间的一些占用存储空间比较小的属性
Frag_N_used 4 FREE_FRAG链表中已使用的页面数量
List base node for FREE list 16 FREE链表基节点
List base node for FREE_FRAG list 16 FREE_FRAG链表基节点
List base node for FULL_FRAG list 16 FULL_FRAG链表基节点
Next unused segment ID 8 下一个没有使用的segment ID
List base node for SEG_INODE_FULL list 16 SEG_INODE_FULL链表基节点
List base node for SEG_INODE_FREE list 16 SEG_INODE_FREE链表基节点

2.1.2 XDES Entry

名称 大小 描述
Segment ID 8 段ID
Prev node page number 4 与offset组成指向前一个XDES Entry的指针
Prev node offset 2
Next node page number 4 与offset组成指向后一个XDES Entry的指针
Next node offset 2
State 4 FREE、FREE_FRAG、FULL_FRAG、FSEG
Page state bitmap 16 标注区内的页是否空闲

2.2 XDES页

与FSP_HDR基本一致,除了没有File Space Header。

2.3 IBUF_BITMAP页

与change buffer有关。

2.4 INODE页

名称 大小 描述
List node for INODE page list 12 指向上一个INODE页和下一个INODE页的指针
INODE Entry 16320 INODE Entry结构

INODE Entry有以下结构:

名称 大小 描述
Segment ID 8 段ID
List base node for FREE list 16 段FREE链表基节点
List base node for NOT FULL list 16 段NOT_FULL链表基节点
List base node for FULL list 16 段FULL链表基节点
Magic number 4 标注INODE Entry是否被初始化
Fragment Array Entry 0~32 32*4 零散页面

2.5 段

为提高磁盘性能,当索引的数据量大的时候按区分配,使B+树叶子节点更连续。

每个B+树分为两个段、叶子节点段和非叶子节点段,每个段对应一个INODE Entry结构。当插入数据时,一开始数据量较小,从碎片区分配单个页面。当某个段占用了32个碎片区后,按区为单位分配空间。

2.6 链表

2.6.1 直属于表空间的链表

  • FREE:空闲的区。
  • FREE_FRAG:有剩余空间的碎片区。
  • FULL_FRAG:没有剩余空间的碎片区。

    以上区由XDES Entry结构组成链表,链表基节点在FSP_HDR页File Space Header中。

  • INODE_FREE:INODE页面仍有空闲空间存放INODE Entry结构。
  • INODE_FULL:INODE页面没有空闲空间存放INODE Entry结构。

    INODE页由List node for INODE page list组成链表,基节点在FSP_HDR页File Space Header中。

2.6.2 直属于段的链表

  • FREE:段内空闲的区。
  • NOT_FULL:仍有空闲页面的区。
  • FULL:没有空闲页面的区。

    以上区由XDES Entry结构组成链表,链表基节点在INODE页INODE Entry结构中。

继续阅读