网上写MySQL架构的文章比较多,写InnoDB架构的文章比较少,今天简单说说InnoDB架构。
画外音:一分钟,一幅图,秒懂。面试
MySQL总体分为三层:
(1)客户端,是各类编程语言的connector;
(2)MySQL服务,内部包含各类组件,实现各类功能;
(3)文件系统,数据存储与日志;数据库
其中,MySQL服务内,能够以插件的形式,实现各类存储引擎。编程
在InnoDB,MyISAM,Memory…等各类存储引擎中,InnoDB是使用范围最广的。
画外音:事务,行锁,汇集索引,MVCC…众多特性让InnoDB备受青睐。缓存
InnoDB总体也分为三层:
(1)内存结构(In-Memory Structure),这一层在MySQL服务进程内;
(2)OS Cache,这一层属于内核态内存;
(3)磁盘结构(On-Disk Structure),这一层在文件系统上;markdown
这三层的交互有两类:
(1)经过OS Cache落地数据(上图中,两个短箭头);
(2)直接O_Direct落地数据(长途中,长箭头);
画外音:这是一个性能与一致性折衷的设计。架构
InnoDB内存结构包含四大核心组件,分别是:
(1)缓冲池(Buffer Pool);
(2)写缓冲(Change Buffer);
(3)自适应哈希索引(Adaptive Hash Index);
(4)日志缓冲(Log Buffer);并发
刚好,这四大核心组件,今年都详细的写过。编程语言
目的是提高InnoDB性能,加速读请求,避免每次数据访问都进行磁盘IO。
画外音:和系统架构设计中缓存的功能有点像,避免每次访问数据库。
这里面涉及的技术点包括:预读,局部性原理,LRU,预读失败+缓冲池污染,新生代老生代双链LRU…细节参见《缓冲池(buffer pool),完全懂了!》。ide
目的是提高InnoDB性能,加速写请求,避免每次写入都进行磁盘IO。
画外音:我C,这个牛逼,写入竟然均可以不进行磁盘IO?
细节参见《写缓冲(change buffer),完全懂了!》,这篇文章的细节原理,特别有意思。高并发
目的是提高InnoDB性能,加速读请求,减小索引查询的寻路路径。
这里面涉及的技术点包括:汇集索引,普通索引,哈希索引…细节参见《InnoDB到底支不支持哈希索引》。
目的是提高InnoDB性能,极大优化redo日志性能,并提供了高并发与强一致性的折衷方案。
这里面涉及的技术点包括:redo log做用,流程,三层架构,随机写优化为顺序写,次次写优化为批量写…细节参见《事务已提交,数据却丢了,赶忙检查下LogBuffer》。
主要包括日志与表空间,其结构与原理比InnoDB内存结构更加复杂,若是你们感兴趣,将来再撰文详述。
一分钟系列,但愿你们对InnoDB架构,以及InnoDB内存结构的四大组件有了更系统性的了解。
知其然,知其因此然,但愿你们有收获。
架构师之路-分享技术思路
《缓冲池(buffer pool),完全懂了!》
《写缓冲(change buffer),完全懂了!》
《InnoDB到底支不支持哈希索引?》
《事务已提交,数据却丢了,赶忙检查下LogBuffer》
末了,昨天有个朋友留言“谢谢”,说面试过程当中,用从“架构师之路”里学到的知识,完美回答了面试官提出的一个MySQL底层细节问题,顺利拿到offer,涨薪20%。后来他和面试官一对,原来面试官也是看了架构师之路才学会的这个MySQL知识点,才问了相关的问题。
我但愿你们从“架构师之路”学到东西,职业生涯往上走,这是个人初衷。若是你们把学到的新知识,拿来出题为难面试者,这不是我想看到的,这样对没有订阅“架构师之路”的朋友不公平。
我承诺,不把从架构师之路中学到的新知识,做为面试候选人的面试题!
谢谢你们的支持!