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在磁盘上的位置
相关推荐
Kim Jackson2 小时前
我的世界Java版1.21.4的Fabric模组开发教程(二十三)创建生物(下)实体在游戏中的实现(1)
java·游戏·fabric
温柔一只鬼.2 小时前
GUI学习——day2
java·开发语言·学习
东离与糖宝2 小时前
Spring Boot 3 + Qwen 3.5 最佳实践:从接口调用到 RAG 向量检索一站式开发
java·人工智能
Keanu-2 小时前
Mysqlrouter 配置与测试
mysql·adb
零雲2 小时前
java面试:Spring是如何解决循环依赖问题的
java·spring·面试
oradh3 小时前
Oracle 11g单库环境PSU补丁安装
数据库·oracle
Java面试题总结3 小时前
PostgreSQL表名超长踩坑记
数据库·postgresql
泯仲3 小时前
从零起步学习MySQL 第三章:DML语句定义及常见用法示例
数据库·学习·mysql
饕餮争锋3 小时前
Java泛型介绍
java·开发语言