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在磁盘上的位置
相关推荐
SHoM SSER2 分钟前
SQL之CASE WHEN用法详解
数据库·python·sql
likerhood7 分钟前
java中的return this、链式编程和Builder模式
java·开发语言
spring2997928 分钟前
Spring Boot 实战篇(四):实现用户登录与注册功能
java·spring boot·后端
Caspian Wren9 分钟前
通过Logstash将MySQL数据同步到ES
数据库·mysql·elasticsearch·logstash
2401_8359568111 分钟前
Golang怎么做代码热更新_Golang热更新教程【精通】
jvm·数据库·python
justjinji14 分钟前
如何解决Oracle JDBC驱动版本的兼容性问题_ojdbc8.jar与JDK版本的对应关系
jvm·数据库·python
cyber_两只龙宝21 分钟前
【Oracle】Oracle之SQL的聚合函数和分组
linux·运维·数据库·sql·云原生·oracle
2301_7775993726 分钟前
CSS中如何让浮动元素撑开父容器_深度解析清除浮动
jvm·数据库·python
2401_8716965228 分钟前
c++如何将程序的私有配置信息加密保存为.enc格式的二进制文件【详解】
jvm·数据库·python
2301_7751481530 分钟前
Redis如何管理高频写入下的AOF文件膨胀_通过调低auto-aof-rewrite-percentage提速重写
jvm·数据库·python