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在磁盘上的位置
相关推荐
AI人工智能+电脑小能手2 小时前
【大白话说Java面试题 第87题】【Mysql篇】第17题:分布式事务的实现原理?
java·数据库·分布式·mysql·面试
yyuuuzz2 小时前
独立站的技术基础与常见运维问题
大数据·运维·服务器·网络·数据库·aws
来杯@Java3 小时前
图书管理系统(基于springboot+vue前后端分离的项目)计算机毕业设计java
java·spring boot·spring·vue·毕业设计·mybatis·课程设计
卷毛的技术笔记3 小时前
告别硬编码!Spring AI Alibaba 实现 AI Agent 智能工具调用(Tool Calling)
java·人工智能·后端·python·spring·ai编程
编程大师哥3 小时前
匿名函数 lambda + 高阶函数
java·python·算法
東雪木4 小时前
多线程与并发编程 专属复习笔记
java·开发语言·笔记·java面试
adrninistrat0r4 小时前
Java调用链MCP分析工具
java·python·ai编程
噜噜噜阿鲁~4 小时前
python学习笔记 | 11.3、面向对象高级编程-多重继承
java·开发语言
春生野草5 小时前
反射、Tomcat执行
java·开发语言
键盘上的猫头鹰5 小时前
【MySQL 教程(八)】索引、事务、用户管理、导入导出与分页查询
数据库·python·mysql