本文 的 原文 地址
原始的内容,请参考 本文 的 原文 地址
尼恩说在前面
在40岁老架构师 尼恩的读者交流群(50+)中,最近有小伙伴拿到了一线互联网企业如得物、阿里、滴滴、极兔、有赞、希音、百度、网易、美团、蚂蚁、得物的面试资格,遇到很多很重要的相关面试题:
InnoDB 内存结构 和 磁盘 结构, 你理解吗?
什么是 Doublewrite Buffer ?InnoDB是如何实现 Doublewrite Buffer 的?
比较undo log、redo log和bin log的作用和区别?
最近有小伙伴在面 腾讯,问到了mysql InnoDB 存储引擎 相关的面试题。 小伙伴 没有系统的去梳理和总结,所以支支吾吾的说了几句,面试官不满意,面试挂了。
所以,尼恩给大家做一下系统化、体系化的梳理,使得大家内力猛增,可以充分展示一下大家雄厚的 “技术肌肉”,让面试官爱到 “不能自已、口水直流”,然后实现”offer直提”。
当然,这道面试题,以及参考答案,也会收入咱们的 《尼恩Java面试宝典PDF》V175版本,供后面的小伙伴参考,提升大家的 3高 架构、设计、开发水平。
《尼恩 架构笔记》《尼恩高并发三部曲》《尼恩Java面试宝典》的PDF,请到文末公号【技术自由圈】获取
本文作者:
- 第一作者 老架构师 肖恩(肖恩 是尼恩团队 高级架构师,负责写此文的第一稿,初稿 )
- 第二作者 老架构师 尼恩 (45岁老架构师, 负责 提升此文的 技术高度,让大家有一种 俯视 技术、俯瞰技术、 技术自由 的感觉)
一、InnoDB 存储引擎
1、MySQL体系和InnoDB存储引擎
MySQL的体系结构是分层设计的,包括Server层和 Engin层。
1. 服务层(Server层):处理连接、查询解析、优化、内置函数
2. 存储引擎层(Engin层):负责数据存储/检索(可插拔)
Engin层 是可以拔插设计, 可以 选择不同的 存储引擎。
InnoDB 属于 Engin层 ,是默认的 存储引擎, 负责 "最终数据存储与管理"的核心组件。
MySQL整体架构:
各层作用:
- 连接层:处理客户端接入(如TCP连接),验证密码,管理连接池。
- 服务层:负责SQL的解析、优化(比如选最优索引)、缓存,以及执行存储过程等。
- 存储引擎层:这是MySQL的"数据管家",通过统一接口与服务层交互。InnoDB是其中功能最完善的(支持事务、行锁等),直接对接磁盘文件。
- 文件系统层:最终存储数据的物理文件(如
.ibd
数据文件、日志文件等)。
关键点:可拔插架构中,有一套规范的I/O操作接口,InnoDB通过标准接口嵌入MySQL,处理所有数据I/O操作
2、Inno DB总体架构
InnoDB 存储引擎目前也是应用最广泛的存储引擎。 从 MySQL 5.5 版本开始作为表的默认存储引擎。
InnoDB 存储引擎 最早由 Innobase Oy 公司开发(属第三方存储引擎)。
InnoDB 存储引擎 是第一个完整支持 ACID 事务的 MySQL 存储引擎,特点是行锁设计、支持 MVCC、支持外键、提供一致性非锁定读,非常适合 OLTP 场景的应用使用。
InnoDB 存储引擎架构包含内存结构和磁盘结构两大部分
MySQL 8.0 版本,总体架构图如下:
MySQL 5.5 版本,总体架构图如下:
3、Inno DB数据读写流程
关键步骤:
1)读路径:优先检查缓冲池,未命中时从.ibd(也就是各种表空间)加载
2)写路径:
- 先写redo log(顺序I/O)
- 异步写入数据文件(随机I/O)
SHOW ENGINE INNODB STATUS\G -- 查看刷脏进度
3)崩溃恢复:通过redo log重做未落盘操作
二、InnoDB内存架构
InnoDB的内存就像"高速缓存区",减少磁盘IO,提升速度。
主要组件如下:
核心组件:
(1) Buffer Pool 数据热区枢纽
:
预分配连续内存缓存数据页,通过LRU算法管理热数据,将随机I/O转为内存操作。
(2) Log Buffer 写操作高速通道
:
暂存事务中的redo日志,innodb_flush_log_at_trx_commit
控制刷盘策略,平衡性能与安全。
(3) Change Buffer 非聚簇索引加速器
:
缓存非唯一索引的DML操作(INSERT/UPDATE/DELETE),后台异步合并到磁盘索引结构。
(4) 自适应哈希索引 智能路径优化器
:
自动检测高频等值查询路径,在内存中构建哈希索引,突破B+树检索深度限制。
(5) undo 日志缓冲:
InnoDB 内存中临时存放 undo 日志的区域
,用于事务回滚和多版本控制,最终会刷新到磁盘的 Undo 表空间。
2.1、Buffer Pool
2.1.1 什么是 Buffer Pool?
简单说,Buffer Pool 是 InnoDB 存储引擎里一块内存区域,专门用来缓存表数据和索引数据。
就像我们平时把常用的文件放在桌面方便拿取,MySQL 也会把频繁访问的数据存到 Buffer Pool 里,避免每次都去读写磁盘(磁盘速度比内存慢太多),以此提高查询效率。
它是 InnoDB 性能的“核心加速器”,大部分时候,我们查数据、改数据,都是和 Buffer Pool 打交道,而不是直接操作磁盘。
Buffer Pool缓存磁盘数据页(16KB/页)。
通过减少磁盘 I/O 提升性能,使用 LRU 算法 + 冷热分离管理数据页。
2.1.2 数据读取流程
SELECT * FROM table WHERE id=1; -- 直接返回内存数据
关键步骤说明: