MySQL存储结构(磁盘)

1. 不同存储引擎在磁盘文件上的结构均不一致

创建新表时,在磁盘创建两个对应的文件t.frm(较小)和t.ibd(大小取决于表中信息量)
image
5.7版本之后为每个表生成一个idb(独立表空间),之前都是一个共享表空间(系统表空间),独立表空间可压缩可传输
image

2. 独立表空间结构

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

  1. 页的大小固定为16kb,和B+索引树节点对应,不同场景用不同的页,有12种。
  2. 每种页都包含页头和页尾,“主体信息"根据不同的类型有不同结构,最常用的是用来存储数据和索引的“索引页”。
  3. 索引页的主体用数据“行”进行填充,行有四类:REDUNDANT,OMPACT,DYNAMIC,and COMPRESSED。5.7版本后默认为DYNAMIC类型。
  4. 行的最大大小为8kb但是大小不固定,内部主要包括表里某一行的真实数据和一些额外信息。
    image

3. 区、区组结构(物理)和段(逻辑)

  1. 每64个页组成一个地址连续的区,区大小固定为1MB,对于频繁读取的区,可将区内的页都读入内存中的Buffer Pool,减少后续查询对磁盘的访问次数。
    image
  2. 新建一个表时为了不至于一次性占用过大的磁盘空间而导致浪费,新建表时只会创建6个页,不是一个完整的区(96kb)。8.0版本之后创建的是7个页,这些零散“页”会放在表空间中一个叫碎片区的地方。不够用时一个一个新建页,直到“零散页”达到32个,之后每次都会直接申请一个完整的区(64个页)
    image
  3. 区太多时,有区组来管理,每个区组256MB,即为256个区。
    第一个“区组”中的第一个“区”的前四页比较特殊,之后的区组首个区结构一致
    image
  4. “段”的主要功能是用来用来区分不同功能的“区”和在碎片区中“页”,分为叶子节点段和非叶子节点段,和B+索引的叶子和非叶子节点相对应。即:非叶子节点段存储和管理索引树,叶子节点管理实际数据。
    最终由“叶子结点段”,“非叶子结点段”等“段”构成了最终的表空间ibd文件
    image
    image
posted @   zzzzzzzk  阅读(263)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示