文章目录前言表空间文件是什么一、页1、概述2、结构3、 页头页尾4、数据行4.1概述4.2动态格式结构4.2.1可变长度列表如何解决粘包问题4.2.2头信息结构4.3 行与行的组织方式4.4 数据行的查询优化页目录数据页头二、区2.1 概述2.2 碎片区三、区组3.1 概述3.2 组织方式三、段3.1 概述前言表空间文件是什么用MySQL的Innodb创建一个自定义用户表会生成一个idb文件这个文件存储了索引和用户数据.idb文件就是表空间文件。表空间文件有很多类型系统表空间ibdata1存储数据字典、undo日志、双写缓冲区、变更缓冲区等全局数据独立表空间单表表空间.ibd每张InnoDB表独立生成存放表数据、索引临时表空间ibtmp1存储临时表、排序操作产生的临时数据Undo 表空间undoN如undo001、undo002专门存放undo日志MySQL 8.0默认独立拆分Redo 日志文件ib_logfile0、ib_logfile1属于重做日志崩溃恢复核心文件通用表空间自定义命名如test.ibd可容纳多张表由CREATE TABLESPACE创建一、页1、概述页是Innodb进行磁盘IO操作的最小单位默认16kb。可以通过命令修改。建议设置为4的整倍数。原因是大部分操作系统进行IO操作的最小单位是4kb如果是非4的整倍数需要进行额外的cpu计算降低性能。2、结构3、 页头页尾页头结构页尾结构LSNLog Sequence Number 日志序列号用于记录数据的写入顺序方便灾难恢复、数据刷盘、事务回滚循环递增4、数据行4.1概述数据行主要用于存储索引或用户实际数据。在多种数据行组织类型中目前最主流、最常见的是动态格式Dynamic。4.2动态格式结构4.2.1可变长度列表如何解决粘包问题Innodb读取数据行一般从下一行地址开始从右往左读先读一个字节如果最高位为0则直接截断计算长度如果最高位是1则继续读取一个字节4.2.2头信息结构当需要删除某行数据是innodb不会直接删除而是把delete_mark设置为1并且从数据行链表中断开。存放到垃圾链表中这个垃圾链表可以用于事物会滚4.3 行与行的组织方式next_record作为指针最小行和最大行组成一个链表的头、尾巴中间存放实际的索引或者用户数据向左可以读取元信息向右可以读取值4.4 数据行的查询优化页目录一个数据页内包含许多的数据行innodb不会直接暴力枚举。他会把连续的数据行进行顺序排列分组最多8行一组形成一个槽。槽内包含了组内最大heap_no。当需要查询某行数据时给予槽的最大heap_no进行二分最终在组内进行数据行的枚举就可以快速查询到值这里做个槽组成的可二分的列表就是页目录数据页头存储了数据行集合的一些统计信息、位置信息、索引和事务信息二、区2.1 概述64个页组成一个区即一个区默认1MB大小。区中的页是物理上连续的这里运用到了局部性原理2.2 碎片区如果建立的空表innodb不会创建一个完整的区若数据量不大只有几个数据页的话。它会把表的一些元数据存储到数据页中默认7个组成一个碎片区碎片区中的页被称为零散页。目的是节省空间。只有当插入新数据使得总的页数大于32才会申请一个区进行存储三、区组3.1 概述实际使用数据库的时候数据查询可能大于1MB为了进一步提升查询速度和局部性原理的使用innodb维护了区组的物理结构。默认256个区形成一个区组。3.2 组织方式区组中第一个区的前四个页比较特殊存储了一些元数据表空间和区组条目信息change buffer信息段信息索引数节点信息三、段3.1 概述段是Innodb组织数据的逻辑概念也就是一种数据结构。一个段中包含多个区组根据实际存储情况而定段的类型分为叶子节点段和非叶子节点段和B数索引的叶子节点和非叶子节点相互对应。一个.idb文件包含多个B树。