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但是大小不固定,内部主要包括表里某一行的真实数据和一些额外信息。
3. 区、区组结构(物理)和段(逻辑)
- 每64个页组成一个地址连续的区,区大小固定为1MB,对于频繁读取的区,可将区内的页都读入内存中的Buffer Pool,减少后续查询对磁盘的访问次数。
- 新建一个表时为了不至于一次性占用过大的磁盘空间而导致浪费,新建表时只会创建6个页,不是一个完整的区(96kb)。8.0版本之后创建的是7个页,这些零散“页”会放在表空间中一个叫碎片区的地方。不够用时一个一个新建页,直到“零散页”达到32个,之后每次都会直接申请一个完整的区(64个页)
- 区太多时,有区组来管理,每个区组256MB,即为256个区。
第一个“区组”中的第一个“区”的前四页比较特殊,之后的区组首个区结构一致
- “段”的主要功能是用来用来区分不同功能的“区”和在碎片区中“页”,分为叶子节点段和非叶子节点段,和B+索引的叶子和非叶子节点相对应。即:非叶子节点段存储和管理索引树,叶子节点管理实际数据。
最终由“叶子结点段”,“非叶子结点段”等“段”构成了最终的表空间ibd文件
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!