MySQL存储结构(磁盘)
1. 不同存储引擎在磁盘文件上的结构均不一致
创建新表时,在磁盘创建两个对应的文件t.frm(较小)和t.ibd(大小取决于表中信息量)

5.7版本之后为每个表生成一个idb(独立表空间),之前都是一个共享表空间(系统表空间),独立表空间可压缩可传输

2. 独立表空间结构
在idb文件中,“页”是InnoDB中内存和磁盘交互的最小的存储单元,每次交互至少读取一个页,每个页内部的地址都是连续的,一般读取的数据都是连续的,减少系统IO操作。

- 页的大小固定为16kb,和B+索引树节点对应,不同场景用不同的页,有12种。
- 每种页都包含页头和页尾,“主体信息"根据不同的类型有不同结构,最常用的是用来存储数据和索引的“索引页”。
- 索引页的主体用数据“行”进行填充,行有四类:REDUNDANT,OMPACT,DYNAMIC,and COMPRESSED。5.7版本后默认为DYNAMIC类型。
- 行的最大大小为8kb但是大小不固定,内部主要包括表里某一行的真实数据和一些额外信息。
![image]()
3. 区、区组结构(物理)和段(逻辑)
- 每64个页组成一个地址连续的区,区大小固定为1MB,对于频繁读取的区,可将区内的页都读入内存中的Buffer Pool,减少后续查询对磁盘的访问次数。
![image]()
- 新建一个表时为了不至于一次性占用过大的磁盘空间而导致浪费,新建表时只会创建6个页,不是一个完整的区(96kb)。8.0版本之后创建的是7个页,这些零散“页”会放在表空间中一个叫碎片区的地方。不够用时一个一个新建页,直到“零散页”达到32个,之后每次都会直接申请一个完整的区(64个页)
![image]()
- 区太多时,有区组来管理,每个区组256MB,即为256个区。
第一个“区组”中的第一个“区”的前四页比较特殊,之后的区组首个区结构一致
![image]()
- “段”的主要功能是用来用来区分不同功能的“区”和在碎片区中“页”,分为叶子节点段和非叶子节点段,和B+索引的叶子和非叶子节点相对应。即:非叶子节点段存储和管理索引树,叶子节点管理实际数据。
最终由“叶子结点段”,“非叶子结点段”等“段”构成了最终的表空间ibd文件
![image]()
![image]()







浙公网安备 33010602011771号