涛声依旧在 发表于 5 天前

【MySQL】一文带你理清InnoDB引擎的<内部架构>(内存结构,磁盘结构,后

前言
大家好吖,欢迎来到 YY 滴MySQL系列 ,热烈欢迎! 本章主要内容面向打仗过C++ Linux的老铁
主要内容含:
https://i-blog.csdnimg.cn/direct/9359547e3ab24e5c9af8be862579c951.png
    欢迎订阅 YY滴C++专栏!更多干货持续更新!以下是传送门!


[*]YY的《C++》专栏
[*]YY的《C++11》专栏
[*]YY的《Linux》专栏
[*]YY的《数据结构》专栏
[*]YY的《C语言底子》专栏
[*]YY的《初学者易错点》专栏
[*]YY的《小小知识点》专栏
[*]YY的《单片机期末速过》专栏
[*]YY的《C++期末速过》专栏
[*]YY的《单片机》专栏
[*]YY的《STM32》专栏
[*]YY的《数据库》专栏
[*]YY的《数据库原理》专栏


一.架构



[*]MySQL5.5版本开始,默认利用|nnoDB存储引擎,它擅长变乱处理,具有崩溃恢复特性,在一样寻常开发中利用非常广泛。
[*]下面是InnoDB架构图, 左侧为内存结构,右侧为磁盘结构。
[*]简单看一下,下面有具体介绍
https://i-blog.csdnimg.cn/direct/89acf27fdd7a4f068162d05555a3f5b6.png
1.内存结构

InnoDB引擎的内存架构分为下面四个:

[*]缓冲池:Buffer Pool
[*]更改缓冲区:Change Buffer——(针对非唯一,二级索引页)
[*]自适应哈希索引
[*]日志缓冲区
1.缓冲池:Buffer Pool

https://i-blog.csdnimg.cn/direct/3881e5ac540c4ddab03d37821f87fe3e.png
2.更改缓冲区:Change Buffer



[*]Change Buffer的意义
[*]在增编削查时,不消每一次直接利用磁盘IO, 先利用Change Buffer中的数据(合并处理等利用)。
[*] 再以肯定频率把Change Buffer中的数据同步到Buffer Pool ,最后再革新到磁盘中
https://i-blog.csdnimg.cn/direct/9a08196257ca419680a273d5ca7e6e9f.png
https://i-blog.csdnimg.cn/direct/6a9b42fe6d424763b0b6c380fb680c27.png
3.自适应哈希索引:Adaptive Hash index



[*]InnoDB引擎 默认不支持哈希索引 ,支持 B+树索引。
[*]前情提要,哈希索引上风是快,只需要一次匹配即可(清除哈希冲突情况下)。而B+树则需要匹配两三次。
[*]但哈希索引的范围在于,不能做范围查询,只能做等值匹配等利用
[*]所以自适应哈希索引等于是上了一层自动监控, 假如hash索引更快,他会创建哈希索引
https://i-blog.csdnimg.cn/direct/f8366d0ac0544d55b479524218d67d1f.png
4.日志缓冲区:Log Buffer



[*]用于生存日志文件redolog,undolog
https://i-blog.csdnimg.cn/direct/de396a633d3c450b855fabbeb160ebbe.png
2.磁盘结构

结构总览,具体解读在下面
https://i-blog.csdnimg.cn/direct/c7f768591b6d44ba9ae73281243a55aa.png
1.系统表空间:System Tablespace



[*]System Tablespace: 系统表空间 是 更改缓冲区 的 存储区域 。
[*]假如表是在系统表空间而不是每个表文件或通用表空间中创建的,它也大概包含表和索引数据。(在MySQL5.x版本中还包含InnoDB数据字典、undolog等)
参数:innodb_data_file_path
https://i-blog.csdnimg.cn/direct/fae22816821444ccac404ea0ac865760.png
2.表的独立表空间:File-Per-Table Tablespaces



[*]取决于独立表空间的开关【参数:innodb_file_per_able】是否开启,若开启。则相干数据不会上上文所述系统表空间System Tablespace中存放
[*]File-Per-Table Tablespaces:每个表的文件表空间包含单个InnoDB表的数据和索引,并存储在文件系统上的单个数据文件中
https://i-blog.csdnimg.cn/direct/46811c8542df4159a0baaacef9ff49cd.png
3.通用表空间:GeneralTablespaces



[*] 不自己创建,则没有这块表空间文件
[*]GeneralTablespaces:通用表空间,需要通过CREATE TABLESPACE 语法创建通用表空间,在创建表时,可以指定该表空间。
https://i-blog.csdnimg.cn/direct/d39d98fc2246473caaa5ad6de6d5fd55.png
4.撤销表空间:Undo Tablespaces



[*]Undo Tablespaces:撤销表空间,MySQL实例在初始化时会自动创建 两个默认的undo表空间 (初始巨细16M)(图中undo_001,undo_002),用于存储undolog日志。
https://i-blog.csdnimg.cn/direct/60d9967582a84a6ca5d7b8ae4b52e519.png
5.临时表空间:Temporary Tablespaces



[*]InnoDB 利用会话临时表空间和全局临时表空间。存储用户创建的临时表等数据
https://i-blog.csdnimg.cn/direct/63ff41b315904e52aee10fdff39b8a73.png
6.双写缓冲区:Doublewrite Buffer Files



[*]一个中转的缓冲区, 出不测时可以通过双写缓冲区恢复数据
[*]Doublewrite Buffer Files:双写缓冲区,innoDB引擎将数据页从Buffer Pool革新到磁盘前,先将数据页写入双写缓冲区文件中,便于系统异常时恢复数据。
[*]双写缓冲区文件【.dblwr】
https://i-blog.csdnimg.cn/direct/ad4d82981a864f2880fac6da2f69fb1b.png
7.重做日志:Redo Log



[*]Redo Log:重做日志,是用来实现变乱的持久性。不会不停生存,隔一段时间会清理没有利用的Redo Log
[*]该日志文件由两部门组成: 重做日志缓冲 (redo logbuffer)以及 重做日志文件 (redo log),前者是在内存中,后者在磁盘中。
[*]当变乱提交之后会把 所有修改信息 都会存到该日志中,用于在革新脏页到磁盘时,发生错误时,举行数据恢复利用。
[*]循环写入涉及下面两个文件
https://i-blog.csdnimg.cn/direct/0e0d9c9514734912b5e93444be517bbf.png
https://i-blog.csdnimg.cn/direct/dbdf8e56f9d044549535ee895a73cf57.png
3.后台线程——把缓冲池信息革新到磁盘当中



[*]后台线程主要作用:把缓冲池信息在合适的机遇革新到磁盘当中
https://i-blog.csdnimg.cn/direct/7baaf8c170514039a080a3458d3a8e42.png
https://i-blog.csdnimg.cn/direct/c5c8b612b42b4c7c9ec87c92369366c5.png


[*]分为4个线程

[*]Master Thread
核心后台线程,负责调理其他线程,还负责将缓冲池中的数据异步革新到磁盘中,保持数据的一致性还包括脏页的革新、合并插入缓存、undo页的接纳
[*]IO Thread
在InnoDB存储引擎中大量利用了AIO来处理IO请求,这样可以极大地提高数据库的性能,而I0Thread主要负责这些IO请求的回调。
https://i-blog.csdnimg.cn/direct/1b81fbbc76614aa8b190cd5cfb84c54e.png
[*]Purge Thread
主要用于接纳变乱已经提交了的undolog,在变乱提交之后,undolog大概不消了,就用它来接纳。
[*]Page Cleaner Thread
帮忙 Master Thread 革新脏页到磁盘的线程,它可以减轻 Master Thread 的工作压力,减少壅闭。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 【MySQL】一文带你理清InnoDB引擎的<内部架构>(内存结构,磁盘结构,后