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结构中。