MySQL表空间
1. MySQL中的表
1.1 IOT表
在inodb存储引擎中,表是根据主键来组织存放的,这种存储方式称之为```Index organized table(IOT)索引组织表.
IOT表的选择主键方式为:
a. 表中定义的primary key
b. 判断表中是否有非空唯一主键
c. 表中的隐藏字段(row id)
ps: 主键的选择根据的是定义索引的顺序,而不是建表的顺序
1.2 InnoDB逻辑存储结构
图示:
InnoDB表是存储在表空间中的,表空间只是一个逻辑的概念,表数据实际是存储在页面里的。
2. 独立表空间
2.1 段 segment
2.1.1 段的概念
段是逻辑的概念,由完整的区和碎片页组成。
2.1.2 段的分类
一个索引分为叶子节点段和非叶子节点段。
段中的数据结构图如下:
2.1.2.1 叶子节点段
主要结构
-
INODE entry结构
一个段里包括多个区,那么INODE Entry就是段的索引。
INODE Entry结构包括零散的页面和三个基节点。基节点如下:
- List Base Node For Free List :空闲的区
- List Base Node For NOT_FULL list: 有剩余页面的碎片区
- List Base Node For FULL List: 表示段里已经使用完的页面
以上链表基节点的逻辑结构如下:
column | coment |
---|---|
Segmen ID | 段ID |
NOT_FULL_N_USED | 在NOT FULL链表内已经使用的页面 |
list base node for free list | 空闲的区 |
list base node for not_full list | 有剩余页面的碎片区 |
magic number | 标记INODE Entry是否已经被初始化 |
fragement array entry | 记录了零散页面的页号 |
list base node for full list | 表示段里已经使用完的页面 |
- 区
一个区是由64个连续的数据页组成的.主要包括以下结构:
- XDES Entry 结构
我们可以理解为XDES entry结构体就是区的索引。
有关XDES Entry的详细讲解可以参考 《2.2 区》章节。 - 页
- FSEG 附属于某个段的区
2.1.2.2 非叶子节点段
和叶子节点段拥有相同的数据结构
2.1.3 碎片区
就是在一个碎片区中,并不是所有的页都是为了存储同一个段的数据而存在的。可以说碎片区是独立存在表空间中和段是并级的。碎片区直属于表空间,并不属于任何一个段。
在刚开始写数据时,并不是从完整的区中申请一个数据页,而是先从碎片区中申请,当碎片区中已经使用了32个数据页时,才会申请一个完整的区装数据。这样设计是为了避免创建小表占用空间过大的问题。
如果用户新创建一张表只有一条数据,且不用碎片区的话,innodb会新开辟一个区,那就是1MB,对于一个只有1行数据的表来说,1MB空间有点大了,故此设计碎片区
2.2 区
2.2.1 区的概念
连续的64个数据页,大概是1M,这64个数据页页号是连续的。
一个段由多个组组成,而256个区构成一组,其中这256个区也是连续的。
第一组最开始的三个页面类型是固定的,分别是FSD_HDR,IBUF_BITMAP,INODE。也就是说第一组的每个区都是以这三个页面开头的。
其余组,例如第二,第3组的开头是XDES,IBUF_BITMAP类型的数据页。
如下图所示:
2.2.2 区的结构
2.2.2.1 XDES Entry结构
- XDES entry数据结构
XDES entry结构总共占用40个字节。
column | comment | value |
---|---|---|
segmentID | 段的唯一编号 | |
list node | 链表类型 | 可选值为: pre node offset(指向前一个xdes entry结构)/next node page number/next node offset(指向后一个xdes entry结构) |
state | 该区的使用状态 | FREE,FREE_FRAGE,FULL_FRAG,FSEG |
page state bitmap | 区中每个页的使用情况 |
-
表空间下 XDES entry结构
xdes entry详细结构参考上方,表空间下的XDES和段中的XDES唯一的区别就是生成的链表不太一样。在表空间会生成FREE,FREE_FRAG,FULL_FRAG,FSEG四个链表。 -
段中区的XDES entry结构
在段中会生成FREE,NOT_