MySQL InnoDB 架构,一幅图秒懂(1/38)

MySQL 三层架构与 InnoDB 内存四大组件——先把地图铺开,再逐个深入

数据库内核实践第 1 课封面:数据库内核01:MySQL InnoDB 架构,一幅图秒懂

MySQL 三层架构与 InnoDB 内存四大组件——先把地图铺开,再逐个深入

《数据库内核原理》第 1 篇:InnoDB 架构总览。

网上写MySQL架构的文章比较多,写InnoDB架构的文章比较少,今天简单说说InnoDB架构。

一分钟,一幅图,秒懂。

MySQL简要架构是怎么样的?

MySQL 三层架构:客户端、MySQL 服务、文件系统

MySQL整体分为三层:

(1)客户端,是各种编程语言的connector;

(2)MySQL服务,内部包含各种组件,实现各种功能;

(3)文件系统,数据存储与日志;

其中,MySQL服务内,可以以插件的形式,实现各种存储引擎。

在InnoDB,MyISAM,Memory…等各种存储引擎中,InnoDB是使用范围最广的。

事务,行锁,聚集索引,MVCC…众多特性让InnoDB备受青睐。

InnoDB简要架构是怎么样的?

InnoDB 三层架构:内存结构、OS Cache、磁盘结构

InnoDB整体也分为三层:

(1)内存结构(In-Memory Structure),这一层在MySQL服务进程内;

(2)OS Cache,这一层属于内核态内存;

(3)磁盘结构(On-Disk Structure),这一层在文件系统上;

这三层的交互有两类:

(1)通过OS Cache落地数据(上图中,两个短箭头);

(2)直接O_Direct落地数据(长途中,长箭头);

这是一个性能与一致性折衷的设计。

InnoDB内存结构包含哪些核心组件?

InnoDB内存结构包含四大核心组件,分别是:

(1)缓冲池(Buffer Pool);

(2)写缓冲(Change Buffer);

(3)自适应哈希索引(Adaptive Hash Index);

(4)日志缓冲(Log Buffer);

恰好,这四大核心组件,本系列后面都会详细展开。

缓冲池(Buffer Pool)

目的是提升InnoDB性能,加速读请求,避免每次数据访问都进行磁盘IO。

和系统架构设计中缓存的功能有点像,避免每次访问数据库。

这里面涉及的技术点包括:预读,局部性原理,LRU,预读失败+缓冲池污染,新生代老生代双链LRU…细节参见第 24 篇《InnoDB 缓冲池 buffer pool:LRU 的两次改良》。

写缓冲(Change Buffer)

目的是提升InnoDB性能,加速写请求,避免每次写入都进行磁盘IO。

我C,这个牛逼,写入居然都可以不进行磁盘IO?

细节参见第 25 篇《InnoDB 写缓冲 change buffer:写请求怎么免磁盘 IO?》,这篇文章的细节原理,特别有意思。

自适应哈希索引(Adaptive Hash Index)

目的是提升InnoDB性能,加速读请求,减少索引查询的寻路路径。

这里面涉及的技术点包括:聚集索引,普通索引,哈希索引…细节参见第 12 篇《InnoDB 到底支不支持哈希索引?》。

日志缓冲(Log Buffer)

目的是提升InnoDB性能,极大优化redo日志性能,并提供了高并发与强一致性的折衷方案。

这里面涉及的技术点包括:redo log作用,流程,三层架构,随机写优化为顺序写,次次写优化为批量写…细节参见第 28 篇《MySQL 事务已提交,数据却丢了?检查 innodb_flush_log_at_trx_commit》。

InnoDB磁盘结构包含哪些核心组件?

主要包括日志与表空间,其结构与原理比InnoDB内存结构更加复杂,如果大家感兴趣,未来再撰文详述。

InnoDB 三层架构回顾

一分钟系列,希望大家对InnoDB架构,以及InnoDB内存结构的四大组件有了更系统性的了解。

检验一下

检索练习 · 三层架构

MySQL 的简要架构分为哪三层?

检索练习 · InnoDB 三层

InnoDB 的三层架构中,「内存结构」与「磁盘结构」之间的数据落地有哪两类方式?

检索练习 · 四大组件

InnoDB 内存结构的四大核心组件是?

检索练习 · 组件职责

四大组件中,哪一个是为了「加速写请求,避免每次写入都进行磁盘 IO」?

架构地图铺开了,接下来的每一篇都是这张地图上的一个点。先从约束讲起——第 2 篇:一个 SQL 为什么只执行了一半?

知其然,知其所以然。思路比结论更重要。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

京ICP备2025137728号-3