当前位置: 首页 > article >正文

InnoDB引擎逻辑存储结构及架构

简化理解版

想象 InnoDB 是一个高效运转的仓库:

  1. 核心内存区 (大脑 & 高速缓存 - 干活超快的地方)

    • 缓冲池 Buffer Pool (最最核心!):

      • 作用: 相当于仓库的“高频货架”。把最常用的数据(表数据、索引)从慢速的磁盘提前搬到快速的内存里。下次要用直接拿,不用跑远路去磁盘。

      • 好处: 读写速度飞起!是 InnoDB 快的关键。

    • 日志缓冲区 Log Buffer

      • 作用: 一个小型“临时笔记本”。记录对数据的修改操作(增删改)📝,写满一本(或定时)就交给“归档员”写到磁盘的大账本里。

      • 好处: 避免频繁写慢速磁盘,先攒着一起写,效率高。

  2. 磁盘结构 (仓库本体 & 账本 - 持久存储的地方)

    • 表空间 Tablespaces (数据大本营):

      • 作用: 磁盘上真正存放你表的数据(.ibd文件)和索引的大容器。想象成仓库的货架和货位规划图。

      • 类型: 系统表空间(ibdata1,存一些公共信息)、独立表空间(每个表有自己的.ibd文件,主流)、临时表空间等。

    • 重做日志 Redo Log (救命账本 - ib_logfile0ib_logfile1):

      • 作用: 一个循环写的“操作流水账”。记录所有修改操作本身(比如“把A记录字段X从1改成2”)。万一仓库突然停电(崩溃),靠这个账本能精确重做一遍没来得及存到货架的操作,保证数据不丢。

      • 关键点: 顺序写、速度快,是崩溃恢复的核心保障。

    • 撤销日志 Undo Log (后悔药记录):

      • 作用: 记录修改前的旧数据版本📜。用来做两件事:

        • 事务回滚(后悔了,撤销操作)。

        • 实现多版本并发控制MVCC(让不同人看到不同时刻的数据快照,互不干扰)。

  3. 线程们 (仓库工人 - 各司其职干活的):

    • 主线程 Master Thread 总管,协调其他工人,负责后台任务(比如定期刷脏页到磁盘、合并插入缓冲等)。

    • IO线程: 专门负责读写磁盘(读数据页到缓冲池、写日志缓冲区到重做日志文件、写脏页数据到表空间等)。分读线程和写线程。

    • 清理线程 Purge Thread 专门回收那些已经没人需要的旧版本数据(由Undo Log产生的)。

    • 页面清理线程 Page Cleaner Thread 专门负责把缓冲池里被修改过但还没写回磁盘的“脏数据页”刷回磁盘。

最简化记忆框架:

  1. 内存干活快: 缓冲池(缓存数据) + 日志缓冲区(攒操作记录)。

  2. 磁盘存永久: 表空间(存数据文件) + 重做日志(崩溃恢复账本) + 撤销日志(回滚/MVCC)。

  3. 线程来协作: 主线程(总管) + IO线程(搬磁盘) + 清理线程(收垃圾) + 页面清理(刷脏页)。

关键互动流程简化版:

  1. 你执行一个UPDATE语句。

  2. InnoDB 先去缓冲池找这条数据在不在内存。

    • 在:直接改内存里的数据(现在它是“脏页”了)。

    • 不在:先让IO线程表空间文件读到缓冲池,再改。

  3. 把“改了哪条数据,怎么改的”这个操作记录写到日志缓冲区

  4. 日志缓冲区满了(或事务提交时),IO线程把这一批操作记录快速顺序写入重做日志redolog文件(磁盘)。

  5. 后台页面清理线程会在合适的时候,把缓冲池里改过的“脏页”慢慢写回表空间文件(磁盘)。

  6. 如果改错了或者事务回滚,撤销日志undolog里记录了旧值,可以恢复。

  7. 如果突然断电,重启时,InnoDB 会检查重做日志,把那些已经记录在日志里(说明操作有效)但还没写回数据文件的操作重做一遍,保证数据不丢。

一句话总结核心:

InnoDB 靠 缓冲池 在内存里飞快干活,用 重做日志 保证数据安全不丢,靠 表空间 存数据文件,撤销日志 支持回滚和多版本读,各种 线程 默默协作完成所有后台任务。

InnoDB引擎逻辑存储结构

架构

1,内存结构

2,磁盘结构

 

3,后台线程

将缓冲池中的数据在合适的时间刷新到磁盘中

http://www.lryc.cn/news/2392662.html

相关文章:

  • KVM——CPU独占
  • 第4讲、Odoo 18 模块系统源码全解与架构深度剖析【modules】
  • pytorch简单线性回归模型
  • 在 HTML 文件中添加图片的常用方法
  • 四、web安全-行业术语
  • Kafka核心技术解析与最佳实践指南
  • Unity基础学习(十二)Unity 物理系统之范围检测
  • JVM 的垃圾回收机制 GC
  • TypeScript 针对 iOS 不支持 JIT 的优化策略总结
  • 00 QEMU源码中文注释与架构讲解
  • ansible template 文件中如果包含{{}} 等非ansible 变量处理
  • Screen 连接远程服务器(Ubuntu)
  • 路由器、网关和光猫三种设备有啥区别?
  • vscode实时预览编辑markdown
  • 2505软考高项第一、二批真题终极汇总
  • 云原生安全基础:Linux 文件权限管理详解
  • A类地址中最小网络号(0.x.x.x) 默认路由 / 无效/未指定地址
  • [嵌入式实验]实验二:LED控制
  • 6.4.2_3最短路径问题_Floyd算法
  • <PLC><socket><西门子>基于西门子S7-1200PLC,实现手机与PLC通讯(通过websocket转接)
  • day 33 python打卡
  • 开发时如何通过Service暴露应用?ClusterIP、NodePort和LoadBalancer类型的使用场景分别是什么?
  • 【机械视觉】Halcon—【六、交集并集差集和仿射变换】
  • 深度学习核心网络架构详解(续):从 Transformers 到生成模型
  • AI智能混剪视频大模型开发方案:从文字到视频的自动化生成·优雅草卓伊凡
  • allWebPlugin中间件VLC专用版之截图功能介绍
  • 【JavaSE】异常处理学习笔记
  • Scratch节日 | 六一儿童节
  • 深度解析:跨学科论文 +“概念迁移表” 模板写作全流程
  • 深度剖析Node.js的原理及事件方式