好久没写笔记啦,趁着过年的这几天时间,赶紧补一补数据库的相关知识,数据库在工作层面用到的还算是比较多的,与编码一样,数据库也追求高可用,工作中接触到最多的数据库应该是mysql或者mysql的衍生数据库了,比较互联网企业那么多,开源的数据库那么少,毫不夸张的说,学好mysql,在90%的互联网企业都能使用到这部分知识,甚至这个比例会更大。

第二章 innodb引擎

2.5.1 masterThread

master内部有多个loop组成,主loop、后台loop、刷新loop、暂停loop
masterthread会根据数据库状态在这几个loop中进行切换。loop被称为主循环,大多数循环这两个操作,每秒钟操作和每十秒钟操作。伪代码如下
image.png
loop通过sleep实现每秒操作和没10秒的操作,但是由于负载的延迟,只能说是大概是这样的。每秒一次的操作大概是这样的image.png
即使某个事物没有一条,innodb存储引擎还是会每秒价格重做日志缓冲中的内容刷新到重做日志文件。这一点是必须知道的,因为这可以很好地解释为什么在大的事物commit时间都很短。
合并插入缓冲并不是每秒都发生的,引擎会判断当前秒内io次数是否小于5次,如果是说明当前io压力较小,可以执行该操作。
同样刷新脏页的操作也不一定会执行。需要判断当前缓存池脏页的比例,如果超过innodb_max_dirty_pages_pct这个参数,默认为90,即90%,如果超过这个阈值,innodb存储引擎认为需要进行磁盘同步操作,就把脏页刷到磁盘上。因此这部分逻辑处理伪代码也可以写成
image.png
这些是每秒都会处理的。接下来看看每10秒的image.png
也比较好理解,就是进行一个总的处理吧,毕竟是10秒一次,可以理解为10秒一次归纳的大动作

第三章 日志系统

在mysql中有许多的日志文件
image.png
他们各自负责记录不同的内容,二进制日志记录了更改的一些信息,但是不记录select 和show语句,因为它们不对系统做出更改。
二进制日志文件主要功能如下
image.png