尺有所短,寸有所长;不忘初心,方得始终

请关注公众号:星河之码

一、数据文件的组成

innodb数据逻辑存储形式为表空间,而每一个独立表空间都会有一个.ibd数据文件,ibd文件从大到小组成:

一个ibd数据文件–>Segment(段)–>Extent(区)–>Page(页)–>Row(行)

  • 表空间(Tablesapce)

    表空间,用于存储多个ibd数据文件,用于存储表的记录和索引,一个文件包含多个段。

  • 段(Segment)】:

    段由数据段、索引段、回滚段组成,innodb存储引擎索引与数据共同存储,数据段即是B+树叶节点,索引段则存储非叶节点

  • 区(Extent)

    区则是由连续页组成,每个区的大小为1M,一个区中一共有64个连续的页

  • 页(Page)

    页是innodb存储引擎磁盘管理的最小单位,页的大小为16KB,即每次数据的读取与写入都是以页为单位

    包含很多种页类型,比如数据页,undo页,系统页,事务数据页,大的BLOB对象页

  • 行(Row)

    行包含记录的字段值,事务ID(Trx id)、滚动指针(Roll pointer)、字段指针(Field pointers)等信息。

二 InnoDB数据页结构

InnoDB将数据划分为若干个页,以页作为磁盘和内存之间交互的基本单位,InnoDB中页的大小一般为 16KB

  • 页的组成

    如图所示,InnoDB数据页由以下七个部分组成,

2.1 File Header(文件头)

File Header用来记录页的一些头信息,由如下8个部分组成,共占用38个字节,如表4-3所示:

  • FIL_PAGE_SPACE_OR_CHKSUM

    • 在MySQL4.0.14版本之前

      该值代表该页属于哪个表空间,当innodb_file_per_table没有开启事,共享表空间中可能存放了许多页,并且这些页属于不同的表空间。

    • MySQL4.0.14之后版本

      该值代表页的checksum值(一种新的checksum值)。

  • FIL_PAGE_OFFSET

    表空间中页的偏移值。

  • FIL_PAGE_PREV,FIL_PAGE_NEXT

    当前页的上一个页以及下一个页。B+Tree特性决定了叶子节点必须是双向列表。

  • FIL_PAGE_LSN

    该值代表该页最后被修改的日志序列位置LSN(Log Sequence Number)。

  • FIL_PAGE_TYPE

    页的类型。十六进制表示,0x45BF代表B+tree叶结点(存放数据的数据页)。

  • FIL_PAGE_FILE_FLUSH_LSN

    该值仅在数据文件中的一个页中定义,代表文件至少被更新到了该LSN值。

  • FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID

    从MySQL 4.1开始,该值代表页属于哪个表空间。

2.2 Page Header(页头)

用来记录数据页的状态信息,由以下14个部分组成,共占用56个字节。

比如本页中已经存储了多少条记录,第一条记录的地址是什么,页目录中存储了多少个槽等。

  • PAGE_N_DIR_SLOTS

    在Page Directory(页目录)中的Slot(槽)数。

  • PAGE_HEAP_TOP

    堆中第一个记录的指针。

  • PAGE_N_HEAP

    堆中的记录数。

  • PAGE_FREE

    指向空闲列表的首指针。

  • PAGE_GARBAGE

    已删除记录的字节数,即行记录结构中,delete flag为1的记录大小的总数。

  • PAGE_LAST_INSERT

    最后插入记录的位置。

  • PAGE_DIRECTION

    最后插入的方向。取值为:

    • PAGE_LEFT(0x01)
    • PAGE_RIGHT(0x02)
    • PAGE_SAME_REC(0x03)
    • PAGE_SAME_PAGE(0x04)
    • PAGE_NO_DIRECTION(0x05)
  • PAGE_N_DIRECTION

    一个方向连续插入记录的数量。

  • PAGE_N_RECS

    该页中记录的数量。

  • PAGE_MAX_TRX_ID

    修改当前页的最大事务ID,该值仅在Secondary Index定义。

  • PAGE_LEVEL

    当前页在索引树中的位置,0x00代表叶节点。

  • PAGE_INDEX_ID

    当前页属于哪个索引ID。

  • PAGE_BTR_SEG_LEAF

    B+树的叶节点中,文件段的首指针位置。注意该值仅在B+树的Root页中定义。

  • PAGE_BTR_SEG_TOP

    B+树的非叶节点中,文件段的首指针位置。注意该值仅在B+树的Root页中定义。

2.3 Infimun+Supremum Records

在InnoDB存储引擎中,每个数据页中有两个虚拟的行记录,用来限定记录的边界。

  • Infimum记录是比该页中任何主键值都要小的值。
  • Supremum指比任何可能大的值还要大的值。

这两个值在页创建时被建立,并且在任何情况下不会被删除,如下图 :

2.4 User Records(用户记录,即行记录)

User Records即实际存储行记录的内容,InnoDB存储引擎表总是B+树索引组织的

每当我们插入一条记录,都会从Free Space部分申请一个记录大小的空间划分到User Records部分,当Free Space部分的空间全部被User Records部分替代掉之后,当前页就被用完了,此时如果还有新的记录插入就需要申请新的页了。

2.5 Free Space(空闲空间)

Free Space指的就是空闲空间,同样也是个链表数据结构。当一条记录被删除后,该空间会被加入空闲链表中。

2.6 Page Directory(页目录)

Page Directory(页目录)中存放了记录的相对位置

  • 所有正常的记录(包括最大和最小记录,不包括为已删除的记录)会被划分为几个组。

  • 每个组的最后一条记录的头信息中的n_owned属性表示该组内共有几条记录。

  • 将每个组的最后一条记录的地址偏移量按顺序存储起来,每个地址偏移量也被称为一个槽。这些地址偏移量都会被存储到靠近页的尾部的地方。

InnoDB并不是每个记录拥有一个槽,InnoDB存储引擎的槽是一个稀疏目录(sparse directory),即一个槽中可能属于(belong to)多个记录,最少属于4条记录,最多属于8条记录。

Slots中记录按照键顺序存放,这样可以利用二叉查找迅速找到记录的指针。假设有(‘i’,‘d’,‘c’,‘b’,‘e’,‘g’,‘l’,‘h’,‘f’,‘j’,‘k’,‘a’),同时假设一个槽中包含4条记录,则Slots中的记录可能是(‘a’,‘e’,‘i’),然后通过recorder header中的next_record来继续查找相关记录。

【B+树索引本身并不能找到具体的一条记录,B+树索引能找到只是该记录所在的页】。数据库把页载入内存,然后通过Page Directory再进行二叉查找。由于二叉查找的时间复杂度很低,同时内存中的查找很快,因此通常我们忽略了这部分查找所用的时间。

所以在一个数据页中查找指定主键值的记录的过程分为两步:

  • 通过二分法确定该记录所在的槽。
  • 通过记录的next_record属性组成的链表遍历查找该槽中的各个记录。

2.7 File Trailer(文件结尾信息)

File Trailer只有一个FIL_PAGE_END_LSN部分,占用8个字节。

  • 主要作用

    保证页能够完整地写入磁盘,校验数据完整性。

    写入过程中磁盘损坏、机器宕机时

  • 具体方法

    前4个字节代表该页的checksum值,最后4个字节和File Header中的FIL_PAGE_LSN相同。

    通过这两个值来和File Header中的FIL_PAGE_SPACE_OR_CHKSUM和FIL_PAGE_LSN值进行比较,看是否一致,以此来保证页的完整性(not corrupted)

MySQL(六):InnoDB数据文件相关推荐

  1. mysql通过拷贝数据文件的方式进行数据库迁移

    mysql通过拷贝数据文件的方式进行数据库迁移 --环境windows 将源机器A数据库拷贝到目标机器B: 我先在目标机器B上安装MySQL,停止mysql服务,然后将源机器A的data下关于数据库的 ...

  2. MySQL进阶 - InnoDB数据页结构

    不同类型的页简介 前边我们简单提了一下页的概念,它是InnoDB管理存储空间的基本单位,一个页的大小一般是16KB.InnoDB为了不同的目的而设计了许多种不同类型的页,比如存放表空间头部信息的页,存 ...

  3. MYSQL 如果把数据文件保存到其他磁盘里

    今天在CSDN上有人问起分开存储数据文件的问题. 现在写下来. 为了突破磁盘搜索的瓶颈.我们要把MYSQL的数据和索引保存到其他不同的磁盘中.目前还只是支持MyISAM引擎.在MYSQL中,官这个叫象 ...

  4. mysql备份文件0kb_Oracle 数据文件大小为0kb或者文件丢失恢复

    接到一个朋友恢复请求,由于rose频繁切换导致文件系统部分数据文件变化为0kb和文件丢失. 故障现象 部分数据文件变化为0kb和文件丢失. 这里比较明显,数据库的users03变为了0kb和users ...

  5. 《UNIX环境高级编程》六系统数据文件和信息读书笔记

    UNIX系统的正常运作需要使用大量与系统有关的数据文件,例如,口令文件/etc/passwd和组文件/etc/group等. 1.口令文件 口令文件的各字段包含在pwd.h>中定义的passwd ...

  6. mysql六:数据备份、pymysql模块

    阅读目录 一 MySQL数据备份 二 pymysql模块 一 MySQL数据备份 #1. 物理备份: 直接复制数据库文件,适用于大型数据库环境.但不能恢复到异构系统中如Windows. #2. 逻辑备 ...

  7. MySQL(六)InnoDB锁详解

    目录 InnoDB 锁的基本类型 锁的基本模式 共享锁(Shared Locks ) 排它锁(Exclusive Locks) 意向锁 锁的原理 锁的算法 记录锁 间隙锁 临键锁 总结​ 事务隔离级别 ...

  8. MySQL导出csv数据文件

    之前使用MySQL导出过一次线上数据,当时解决了乱码和数据没有正常分隔的问题. 参见这篇文章: 记一次"曲折"的MySQL数据导出 前几个月换了工作电脑,这几天又需要导出几十万的线 ...

  9. mysql恢复ibd数据文件

    mysql中的ibd数据恢复 1.清空表空间 1.1操作步骤 首先需要进入该数据库文件目录下,并为这个ibd文件赋权. 1.给ibd文件赋权限 给ibd文件赋权:chown mysql:mysql i ...

最新文章

  1. 新装myeclispse8.6GA、@Override出错
  2. python代码大全p-基于python实现计算两组数据P值
  3. Win7删除休眠文件
  4. Build Tour 2017 中国站北京、上海报名了
  5. 【英语学习】【WOTD】 logy 释义/词源/示例
  6. TCP流量控制和滑动窗口
  7. svn怎么检出两个地址项目_svn 检出项目报错
  8. 算法(四):图解狄克斯特拉算法
  9. 不同加密算法的国际标准与国标
  10. Spring中的jar包详解
  11. 父与子学编程python_Python入门《父与子的编程之旅第2版》+《教孩子学编程Python语言版》...
  12. elementUI + vue实现 Excel筛选功能
  13. Multisim基础 调出面包板
  14. mbr装win10 gpt装linux,安装win10硬盘格式用gpt还是mbr好_安装win10硬盘需要什么格式...
  15. NCBI|线粒体基因组数据上传
  16. Cleanup failed to process the following paths错误的解决
  17. 点线面的特点_描述点线面状事物分布特征
  18. 暗影精灵 6 Plus 快速上手 大量游戏实测
  19. 【ng-alain】解决sf设置了visibleIf的字段,默认执行required验证
  20. 在阿里云CentOS7上搭建ftp服务器

热门文章

  1. 员工跟母亲吐槽被同事欺负,隔天母亲跑到公司打同事,结果蒙了
  2. 热血传奇之周星弛[转载]【出处:未知】
  3. python学习(五)--打印错误信息
  4. 海豚浏览器显示连接服务器失败,海豚浏览器常见问题解答
  5. SQL调优指南笔记6:Explaining and Displaying Execution Plans
  6. unity - 二进制文件操作-存储与读取
  7. html怎么做向下的图标,用CSS和Bootstrap图标制作上下跳动的指示箭头动画效果
  8. 美国少年14岁造出核反应堆
  9. 建设一个网站需要多少钱?
  10. Driver class 'org.gjt.mm.mysql.Driver' could not be found, make sure the 'MySQL' driver (jar file)