简化理解版
想象 InnoDB 是一个高效运转的仓库:
核心内存区 (大脑 & 高速缓存 - 干活超快的地方)
缓冲池
Buffer Pool
(最最核心!):作用: 相当于仓库的“高频货架”。把最常用的数据(表数据、索引)从慢速的磁盘提前搬到快速的内存里。下次要用直接拿,不用跑远路去磁盘。
好处: 读写速度飞起!是 InnoDB 快的关键。
日志缓冲区
Log Buffer
:作用: 一个小型“临时笔记本”。记录对数据的修改操作(增删改)📝,写满一本(或定时)就交给“归档员”写到磁盘的大账本里。
好处: 避免频繁写慢速磁盘,先攒着一起写,效率高。
磁盘结构 (仓库本体 & 账本 - 持久存储的地方)
表空间
Tablespaces
(数据大本营):作用: 磁盘上真正存放你表的数据(
.ibd
文件)和索引的大容器。想象成仓库的货架和货位规划图。类型: 系统表空间(
ibdata1
,存一些公共信息)、独立表空间(每个表有自己的.ibd
文件,主流)、临时表空间等。
重做日志
Redo Log
(救命账本 -ib_logfile0
,ib_logfile1
):作用: 一个循环写的“操作流水账”。记录所有修改操作本身(比如“把A记录字段X从1改成2”)。万一仓库突然停电(崩溃),靠这个账本能精确重做一遍没来得及存到货架的操作,保证数据不丢。
关键点: 顺序写、速度快,是崩溃恢复的核心保障。
撤销日志
Undo Log
(后悔药记录):作用: 记录修改前的旧数据版本📜。用来做两件事:
事务回滚(后悔了,撤销操作)。
实现多版本并发控制
MVCC
(让不同人看到不同时刻的数据快照,互不干扰)。
线程们 (仓库工人 - 各司其职干活的):
主线程
Master Thread
: 总管,协调其他工人,负责后台任务(比如定期刷脏页到磁盘、合并插入缓冲等)。IO线程: 专门负责读写磁盘(读数据页到缓冲池、写日志缓冲区到重做日志文件、写脏页数据到表空间等)。分读线程和写线程。
清理线程
Purge Thread
: 专门回收那些已经没人需要的旧版本数据(由Undo Log
产生的)。页面清理线程
Page Cleaner Thread
: 专门负责把缓冲池里被修改过但还没写回磁盘的“脏数据页”刷回磁盘。
最简化记忆框架:
内存干活快:
缓冲池
(缓存数据) +日志缓冲区
(攒操作记录)。磁盘存永久:
表空间
(存数据文件) +重做日志
(崩溃恢复账本) +撤销日志
(回滚/MVCC)。线程来协作:
主线程
(总管) +IO线程
(搬磁盘) +清理线程
(收垃圾) +页面清理
(刷脏页)。
关键互动流程简化版:
你执行一个
UPDATE
语句。InnoDB 先去
缓冲池
找这条数据在不在内存。在:直接改内存里的数据(现在它是“脏页”了)。
不在:先让
IO线程
从表空间
文件读到缓冲池
,再改。
把“改了哪条数据,怎么改的”这个操作记录写到
日志缓冲区
。日志缓冲区
满了(或事务提交时),IO线程
把这一批操作记录快速顺序写入重做日志redolog
文件(磁盘)。后台
页面清理线程
会在合适的时候,把缓冲池
里改过的“脏页”慢慢写回表空间
文件(磁盘)。如果改错了或者事务回滚,
撤销日志undolog
里记录了旧值,可以恢复。如果突然断电,重启时,InnoDB 会检查
重做日志
,把那些已经记录在日志里(说明操作有效)但还没写回数据文件的操作重做一遍,保证数据不丢。
一句话总结核心:
InnoDB 靠 缓冲池
在内存里飞快干活,用 重做日志
保证数据安全不丢,靠 表空间
存数据文件,撤销日志
支持回滚和多版本读,各种 线程
默默协作完成所有后台任务。
InnoDB引擎逻辑存储结构
架构
1,内存结构
2,磁盘结构
3,后台线程
将缓冲池中的数据在合适的时间刷新到磁盘中