InnoDB 存储引擎

InnoDB 存储引擎

MySQL为什么默认使⽤InnoDB存储引擎?

InnoDB存储引擎的架构

我们后续会对它架构中的每一部分都做出解释

为什么要设计成内存结构和磁盘结构两个部分?

使⽤InnoDB存储引擎创建的表对应的数据⽂件在哪⾥?

当创建一个数据库的时候,会在数据目录生成一个与数据库同名的子目录

MySQL存储结构

在MySQL中表空间分为五类,包括:系统表空间、独⽴表空间、通⽤表空间、临时表空间和撤销表空间

表空间与表空间⽂件的关系是什么?
表空间可以理解为MYSQL为了管理数据⽽设计的⼀种数据结构,主要描述的对结构的定义
表空间⽂件是对定义的具体实现,以⽂件的形式存在于磁盘上
⽤⼾数据在表空间中是怎么存储的?


为什么要使⽤⻚这个数据管理单元?

  • 首先要明确一点,MySQL 中的页是应用层的一个概念,是 MySQL 根据自身的应用场景,定义的一种数据结构。
  • 通常操作系统中的文件系统在管理磁盘文件时以 4KB 大小为一个管理单元,称为 "数据块",但是在数据库的应用场景里,查询时数据量都比较大,如果也使用 4KB 做数据存储的最小的单元,就显得有点小了,同时会造成频繁的磁盘 I/O,导致降低效率;
  • 所以 MySQL 根据自身情况定义了大小为 16KB 的页,做为磁盘管理的最小单位;
  • 每次内存与磁盘的交互至少读取一页,所以在磁盘中每个页内部的地址都是连续的,之所以这样做,是因为在使用数据的过程中,根据局部性原理,将来要使用的数据大概率与当前访问的数据在空间上是临近的,所以一次从磁盘中读取一页的数据放入内存中,当下次查询的数据还在这个页中时就可以从内存中直接读取,从而减少磁盘 I/O,提高性能。

页的基本介绍

在不同的场景中页的类型不同,但是都包括页头和页尾,在页头和页尾之间的信息跟页的类型相关


查询的数据超过⼀⻚的⼤⼩,怎么提⾼查询效率?


当表中的数据很少时如何避免空间浪费?


如果访问的数据跨区了怎么办?


以上这些数据结构还有优化的空间吗?

页结构

行结构

头信息区

Null列

变长字段列

缓冲池

缓冲池的作用
缓冲池是如何组织数据的?
chunk的作用
控制块和page页是如何初始化
如何管理页
如何快速找到页
淘汰策略

变更缓冲区

变更缓冲区的作用
变更缓冲区的配置项

日志缓冲区

日志缓冲区的作用

Innodb磁盘

系统表空间
系统表空间存储在哪
相关配置
独立表空间
独立表空间的作用
存储位置
优点
缺点
撤销表空间
撤销表空间的作用
创建表注意事项
删除撤销表空间
撤销日志(Undo Log)
撤销日志的作用
撤销日志写入时机
撤销日志在撤销表空间中的组织形式
撤销日志的格式

1. 旧事务 ID(trx_id / DB_TRX_ID)

  • 定义 :6 字节的隐藏列,记录了最后一次修改该行数据的事务 ID
  • 作用
    • 用于判断当前事务能否看到该行数据。
    • 配合 Read View(读视图)实现隔离级别,如可重复读。
  • 更新时机:每次事务对该行进行插入、更新或删除(逻辑删除)时,都会更新这个 ID。

2. roll_pointer(DB_ROLL_PTR / 回滚指针)

  • 定义 :7 字节的隐藏列,是一个指向 undo log(回滚日志) 的指针。
  • 作用
    • 每次修改数据时,旧版本会被写入 undo log,roll_pointer 就指向这条旧版本记录。
    • 多个版本通过这个指针串联成一条版本链,用于事务回滚和一致性读。
  • 更新时机 :每次更新操作后,新版本记录的 roll_pointer 会指向旧版本的 undo log。
撤销日志的组织形式
如何理解undo链
为什么要落盘撤销日志
撤销日志在内存中保存方式
撤销日志写入过程
撤销日志的清理
双写缓冲区
双写缓冲区的作用

当系统崩溃的时候,就可以通过对比双写缓冲区中的内容和磁盘中内容是否相同来进行恢复数据

如何配置
重做日志(redo Log)
为什么需要Redo Log

这时候有一个问题:如果日志没有刷盘成功怎么办?

简单直接的结论是:如果 Redo Log 没有成功刷入磁盘,那么这个事务就不算提交成功。

在 InnoDB 的设计中,Redo Log 落盘是事务提交的 "终点线" 。针对你担心的 "日志没刷进去" 的情况,InnoDB 有一套严格的机制来处理,主要分为 "提交规则""崩溃恢复" 两个层面:

1. 事务层面:没刷进去,就不算 "提交"

当你执行 COMMIT 指令时,InnoDB 引擎内部的流程是这样的:

  1. 把 Redo Log 写入到 内存中的 Log Buffer
  2. 调用操作系统指令,将 Log Buffer 中的日志 刷入(fsync) 到磁盘的 Redo Log 文件中。
  3. 只有当第 2 步返回成功,数据库才会向客户端返回 "提交成功" 的确认。

所以:

  • 如果日志没刷进去(比如刷盘过程中服务器断电),数据库会认为这个事务从未完成

如果日志落盘失败,则事务提交失败,依靠撤回日志进行撤回

MTR
Redo Log的刷盘时机
如何配置刷盘
不同刷盘配置的影响
Redo Log在磁盘上的位置
相关推荐
nvvas6 小时前
Java 入门(四):数组——数据的集合管理
java·开发语言
吉甫作诵6 小时前
Redis 常用命令大全:11 大类命令速查手册
运维·数据库·redis·缓存·nosql
2501_933670796 小时前
库存管理分析岗校招能力模型:SQL、库存周转、补货预测怎么准备
数据库
Lambert2817 小时前
AgentScope Java 从零(07):官方有权限引擎,我却在工具里写了个 if
java·后端·ai编程
Kyrie_kk7 小时前
Java--ThreadLocal线程副本(一)
java·后端
属于自己的天空7 小时前
不用再手动查表结构了:配好 MCP,Claude Code 自己读数据库生成代码
数据库·后端
Y3815326627 小时前
SERP 数据清洗实战:字段标准化、日期解析与去重键
开发语言·数据库·python·python数据库
君顾17 小时前
本地城市低空经济管理系统定制:城市级低空运营平台架构与落地实战
java·开发语言·飞手
奈斯先生Vector7 小时前
当模型版本不断变化,RelayRouter 能否帮助 AI 应用摆脱深度绑定
android·java·人工智能·开源·aigc
Databend7 小时前
Databend 原生数据血缘:追溯指标来源,检查变更影响
大数据·数据库·sql