InnoDB架构,一幅图秒懂!

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

_画外音:_一分钟,一幅图,秒懂。

MySQL 简要架构是怎么样的?

MySQL 整体分为三层:

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

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

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

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

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

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

InnoDB 简要架构是怎么样的?

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… 细节参见《缓冲池 (buffer pool),彻底懂了!》。

写缓冲 (Change Buffer)

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

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

细节参见《写缓冲 (change buffer),彻底懂了!》,这篇文章的细节原理,特别有意思。

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

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

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

日志缓冲 (Log Buffer)

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

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

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

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

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

知其然,知其所以然,希望大家有收获。

相关文章:

《缓冲池 (buffer pool),彻底懂了!》

《写缓冲 (change buffer),彻底懂了!》

《InnoDB 到底支不支持哈希索引?》

《事务已提交,数据却丢了,赶紧检查下 LogBuffer》

末了,昨天有个朋友留言 “谢谢”,说面试过程中,用从“架构师之路” 里学到的知识,完美回答了面试官提出的一个 MySQL 底层细节问题,顺利拿到 offer,涨薪 20%。后来他和面试官一对,原来面试官也是看了架构师之路才学会的这个 MySQL 知识点,才问了相关的问题。

为啥说这个事?

我希望大家从 “架构师之路” 学到东西,职业生涯往上走,这是我的初衷。如果大家把学到的新知识,拿来出题为难面试者,这不是我想看到的,这样对没有订阅 “架构师之路” 的朋友不公平。

我承诺,不把从架构师之路中学到的新知识,作为面试候选人的面试题!

谢谢大家的支持!

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%