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

发布于:2025-05-31 ⋅ 阅读:(16) ⋅ 点赞:(0)

简化理解版

想象 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,后台线程

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