MySQL学习笔记 004:数据目录、表空间
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结构中。